emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: "numbchild@gmail.com" <numbchild@gmail.com>
To: Tim Cross <theophilusx@gmail.com>
Cc: Org-mode <emacs-orgmode@gnu.org>
Subject: Re: ob-clojure evaluate error when Org-mode buffer has ns clojure code
Date: Sun, 18 Jun 2017 13:48:45 +0800	[thread overview]
Message-ID: <CAL1eYu+Q7JRFEDv2y=p23EiEKPptyWTD_eh=2pHKFqOeR2it+g@mail.gmail.com> (raw)
In-Reply-To: <87vanuayo1.fsf@gmail.com>

[-- Attachment #1: Type: text/plain, Size: 13702 bytes --]

I see, thanks very much.

[stardiviner]           <Hack this world!>      GPG key ID: 47C32433
IRC(freeenode): stardiviner                     Twitter:  @numbchild
Key fingerprint = 9BAA 92BC CDDD B9EF 3B36  CB99 B8C4 B8E5 47C3 2433
Blog: http://stardiviner.github.io/

On Sun, Jun 18, 2017 at 9:10 AM, Tim Cross <theophilusx@gmail.com> wrote:

>
> It looks like you have a combination of both clojure errors and possibly
> org babel errors. You need to sort out the clojure errors before you can
> verify there are any problems with org babel clojure support.
>
> You mention that
>
> > I start CIDER REPL session with `cider-jack-in` without project in
> > Emacs.
>
> but then you say
>
> > But I require `incanter` works, I have `incanter` in Leiningen
> > dependencies.
>
> However, if you don't have a project, then you don't have a project.clj
> file and if you don't have a project.clj file, you don't have a
> :dependencies block with incanter as a specified dependency, so incanter
> is not in your classpath and therefore will not be found when you try to
> require it.
>
> Note also that you have incorrect syntax for your require
> statement. Also to be clear, (ns ... (:require ...)) does not define
> dependencies. It simply loads the library into the namespace.
>
> The correct syntax for your first block is
>
> (ns my-kk
>   (:require [incanter.core :as k]))
>
> There is no quote before the lib spec - this is also what the error
> message is telling you. If you call require as a function, then you do
> need to use the quote i.e.
>
> (require 'incanter.core :as k)
>
> You appear to have two main problems here and that is making things
> 'muddy'. I'm guessing your learning clojure as well as using org babel
> clojure support. You need to sort out the clojure problems first. Highly
> recommend you suspend using org mode to do your clojure until your
> across all the clojure specifics and have a good understanding of the
> clojure environment. You will need a good understanding of how clojure
> works to then be able to work out what you need to do to get it to work
> with org mode. Trying to do both at the same time will just cause
> confusion.
>
> HTH
>
> Tim
>
> numbchild@gmail.com writes:
>
> > I did configure `ob-clojure` with the following settings:
> >
> > ```elisp
> > (require 'ob-clojure)
> >
> > ;; use CIDER as the Clojure execution backend
> > (setq org-babel-clojure-backend 'cider)
> >
> > ;; Useful keybindings when using Clojure from Org
> > ;; (org-defkey org-mode-map (kbd "C-x C-e") 'cider-eval-last-sexp)
> > ;; (org-defkey org-mode-map (kbd "C-c C-d") 'cider-doc)
> >
> > ;; No timeout when executing calls on Cider via nrepl
> > ;; (setq org-babel-clojure-sync-nrepl-timeout nil)
> >
> > ;; let `ob-clojure' babel src blocks allow evaluation.
> > (add-to-list 'org-babel-default-header-args:clojure
> >              '(:eval . "yes"))
> > (add-to-list 'org-babel-default-header-args:clojure
> >              '(:results . "output"))
> > ;; (add-to-list 'org-babel-default-header-args:clojure
> > ;;              '(:show-process . t))
> > ```
> >
> > I start CIDER REPL session with `cider-jack-in` without project in Emacs.
> >
> > I changed namespace to `user` in src blocks like this:
> >
> > ```org
> > #+BEGIN_SRC clojure
> > (ns user
> >   (:require '[incanter.core :as kk]))
> > #+END_SRC
> >
> > #+RESULTS:
> >
> > #+BEGIN_SRC clojure :session :results output
> > (print "hi")
> > (def kkkk "hello")
> > #+END_SRC
> >
> > #+RESULTS:
> > : hi
> > ```
> >
> > Then it works.
> >
> > Seems you're right, might my first src block can't work correctly. That
> > caused second src block evaluation failed.
> >
> > But I require `incanter` works, I have `incanter` in Leiningen
> dependencies.
> > ```clojure
> > (require '[incanter.core :as kk])
> > ```
> >
> > But include `incanter` in namespace failed:
> > ```clojure
> > (ns user
> >   (:require '[incanter.core :as kk]))
> > ```
> > with the following error.
> > ```
> >   Show: Clojure Java REPL Tooling Duplicates All  (29 frames hidden)
> >
> > 2. Unhandled clojure.lang.Compiler$CompilerException
> >    Error compiling Code/learning/Emacs/Org-mode/ob-clojure.org at (1:1)
> >
> >                   core.clj: 5771  clojure.core/throw-if
> >                   core.clj: 5835  clojure.core/load-lib
> >                   core.clj: 5832  clojure.core/load-lib
> >                RestFn.java:  142  clojure.lang.RestFn/applyTo
> >                   core.clj:  659  clojure.core/apply
> >                   core.clj: 5893  clojure.core/load-libs
> >                   core.clj: 5873  clojure.core/load-libs
> >                RestFn.java:  137  clojure.lang.RestFn/applyTo
> >                   core.clj:  659  clojure.core/apply
> >                   core.clj: 5911  clojure.core/require
> >                   core.clj: 5911  clojure.core/require
> >                RestFn.java:  408  clojure.lang.RestFn/invoke
> >                       REPL:    1  user/eval46259/loading--auto--
> >                       REPL:    1  user/eval46259
> >                       REPL:    1  user/eval46259
> >              Compiler.java: 6977  clojure.lang.Compiler/eval
> >              Compiler.java: 6966  clojure.lang.Compiler/eval
> >              Compiler.java: 6940  clojure.lang.Compiler/eval
> >                   core.clj: 3187  clojure.core/eval
> >                   core.clj: 3183  clojure.core/eval
> >                   main.clj:  242  clojure.main/repl/read-eval-print/fn
> >                   main.clj:  242  clojure.main/repl/read-eval-print
> >                   main.clj:  260  clojure.main/repl/fn
> >                   main.clj:  260  clojure.main/repl
> >                   main.clj:  176  clojure.main/repl
> >                RestFn.java: 1523  clojure.lang.RestFn/invoke
> >     interruptible_eval.clj:   87
> >  clojure.tools.nrepl.middleware.interruptible-eval/evaluate/fn
> >                   AFn.java:  152  clojure.lang.AFn/applyToHelper
> >                   AFn.java:  144  clojure.lang.AFn/applyTo
> >                   core.clj:  657  clojure.core/apply
> >                   core.clj: 1963  clojure.core/with-bindings*
> >                   core.clj: 1963  clojure.core/with-bindings*
> >                RestFn.java:  425  clojure.lang.RestFn/invoke
> >     interruptible_eval.clj:   85
> >  clojure.tools.nrepl.middleware.interruptible-eval/evaluate
> >     interruptible_eval.clj:   55
> >  clojure.tools.nrepl.middleware.interruptible-eval/evaluate
> >     interruptible_eval.clj:  222
> >  clojure.tools.nrepl.middleware.interruptible-eval/
> interruptible-eval/fn/fn
> >     interruptible_eval.clj:  190
> >  clojure.tools.nrepl.middleware.interruptible-eval/run-next/fn
> >                   AFn.java:   22  clojure.lang.AFn/run
> >    ThreadPoolExecutor.java: 1142
> >  java.util.concurrent.ThreadPoolExecutor/runWorker
> >    ThreadPoolExecutor.java:  617
> >  java.util.concurrent.ThreadPoolExecutor$Worker/run
> >                Thread.java:  745  java.lang.Thread/run
> >
> > 1. Caused by java.lang.Exception
> >    Found lib name 'incanter.stats' containing period with prefix 'quote'.
> > lib
> >    names inside prefix lists must not contain periods
> >
> >                   core.clj:  659  clojure.core/apply
> >                   core.clj: 5893  clojure.core/load-libs
> >                   core.clj: 5873  clojure.core/load-libs
> >                RestFn.java:  137  clojure.lang.RestFn/applyTo
> >                   core.clj:  659  clojure.core/apply
> >                   core.clj: 5911  clojure.core/require
> >                   core.clj: 5911  clojure.core/require
> >                RestFn.java:  408  clojure.lang.RestFn/invoke
> >                       REPL:    1  user/eval46259/loading--auto--
> >                       REPL:    1  user/eval46259
> >                       REPL:    1  user/eval46259
> >              Compiler.java: 6977  clojure.lang.Compiler/eval
> >              Compiler.java: 6966  clojure.lang.Compiler/eval
> >              Compiler.java: 6940  clojure.lang.Compiler/eval
> >                   core.clj: 3187  clojure.core/eval
> >                   core.clj: 3183  clojure.core/eval
> >                   main.clj:  242  clojure.main/repl/read-eval-print/fn
> >                   main.clj:  242  clojure.main/repl/read-eval-print
> >                   main.clj:  260  clojure.main/repl/fn
> >                   main.clj:  260  clojure.main/repl
> >                   main.clj:  176  clojure.main/repl
> >                RestFn.java: 1523  clojure.lang.RestFn/invoke
> >     interruptible_eval.clj:   87
> >  clojure.tools.nrepl.middleware.interruptible-eval/evaluate/fn
> >                   AFn.java:  152  clojure.lang.AFn/applyToHelper
> >                   AFn.java:  144  clojure.lang.AFn/applyTo
> >                   core.clj:  657  clojure.core/apply
> >                   core.clj: 1963  clojure.core/with-bindings*
> >                   core.clj: 1963  clojure.core/with-bindings*
> >                RestFn.java:  425  clojure.lang.RestFn/invoke
> >     interruptible_eval.clj:   85
> >  clojure.tools.nrepl.middleware.interruptible-eval/evaluate
> >     interruptible_eval.clj:   55
> >  clojure.tools.nrepl.middleware.interruptible-eval/evaluate
> >     interruptible_eval.clj:  222
> >  clojure.tools.nrepl.middleware.interruptible-eval/
> interruptible-eval/fn/fn
> >     interruptible_eval.clj:  190
> >  clojure.tools.nrepl.middleware.interruptible-eval/run-next/fn
> >                   AFn.java:   22  clojure.lang.AFn/run
> >    ThreadPoolExecutor.java: 1142
> >  java.util.concurrent.ThreadPoolExecutor/runWorker
> >    ThreadPoolExecutor.java:  617
> >  java.util.concurrent.ThreadPoolExecutor$Worker/run
> >                Thread.java:  745  java.lang.Thread/run
> > ```
> >
> >
> > [stardiviner]           <Hack this world!>      GPG key ID: 47C32433
> > IRC(freeenode): stardiviner                     Twitter:  @numbchild
> > Key fingerprint = 9BAA 92BC CDDD B9EF 3B36  CB99 B8C4 B8E5 47C3 2433
> > Blog: http://stardiviner.github.io/
> >
> > On Sat, Jun 17, 2017 at 9:46 AM, Tim Cross <theophilusx@gmail.com>
> wrote:
> >
> >>
> >> My guess is that cider is not finding the incanter package in the
> >> classpath when the first block attempts to evaluate. Another issue is
> >> that your not using any session options, so your two blocks will be
> >> evaluated in separate environments - not a real problem with your
> >> current example, but will be an issue if you expect to access incanter
> >> functions from separate babel blocks.
> >>
> >> There are a number of working parts which all need to be lined up
> >> correctly before babel clojure support will work correctly. Getting
> >> things to work when your just using core clojure functions is fairly
> >> trivial, but getting it to work when you have to pull in other
> >> dependencies can be a little tricky.
> >>
> >> You might find this article useful to get started
> >>
> >> http://fgiasson.com/blog/index.php/2016/06/21/optimal-
> >> emacs-settings-for-org-mode-for-literate-programming/
> >>
> >> I also notice you have not set the org-babel-clojure-backend, which you
> >> need to do. My recommendation would be to do the following
> >>
> >> 1. Create a leinegen project to experiment with i.e.
> >> lein new app my-kk
> >>
> >> 2. Make sure you can edit and evaluate clojure just using clojure-mode
> >> and cider in emacs
> >>
> >> 3. Add the incanter package to your project.clj dependencies key
> >>
> >> 4. Modify core.clj (using clojure-mode) to include the code in your
> >> clojure blocks and run with cider to make sure they work as expected.
> >>
> >> 5. Create the org file you want to experiment with in the root of your
> >> project. This should ensure that when you try to evaluate clojure
> >> blocks, the cider backend will be loaded with the dependencies in the
> >> project.clj file.
> >>
> >> 6. Copy the code in your core.clj file into ONE babel src block and see
> >> if you can get it to evaluate correctly. Experiment with the block
> >> configuration options like :output etc.
> >>
> >> 7. Break the code up into different blocks and experiment with block
> >> options, especially session options.
> >>
> >> Once you get to that point, you should be across the various moving
> >> parts with sufficient understanding to then look at how you can tweak
> >> things to get exactly the behaviour and workflow you want.
> >>
> >> HTH
> >>
> >> Tim
> >>
> >> numbchild@gmail.com writes:
> >>
> >> > When Org-mode buffer like this:
> >> >
> >> > #+BEGIN_SRC clojure
> >> > (ns my.kk
> >> >   (:require '[incanter.core :as kk]))
> >> > #+END_SRC
> >> >
> >> > #+BEGIN_SRC clojure
> >> > (print "hi")
> >> > (def kkkk "hello")
> >> > #+END_SRC
> >> >
> >> > #+RESULTS:
> >> >
> >> > When I have `(ns ..)` namespace clojure code in buffer, the second
> >> `(print
> >> > ..)` clojure result nothing. But when I remove the first src block,
> the
> >> > `(print ..)` clojure src block works fine.
> >> >
> >> > I'm using Org-mode version from `master` with `use-package` like this:
> >> >
> >> > (use-package org
> >> >   :load-path "~/Code/Emacs/org-mode/lisp/"
> >> >   :pin manual
> >> >   :mode (("\\.org$" . org-mode))
> >> >   :config
> >> >   (use-package org-plus-contrib
> >> >     :load-path "~/Code/Emacs/org-mode/contrib/lisp/"
> >> >     :pin manual)
> >> >   )
> >> >
> >> >
> >> > [stardiviner]           <Hack this world!>      GPG key ID: 47C32433
> >> > IRC(freeenode): stardiviner                     Twitter:  @numbchild
> >> > Key fingerprint = 9BAA 92BC CDDD B9EF 3B36  CB99 B8C4 B8E5 47C3 2433
> >> > Blog: http://stardiviner.github.io/
> >>
> >>
> >> --
> >> Tim Cross
> >>
>
>
> --
> Tim Cross
>

[-- Attachment #2: Type: text/html, Size: 18463 bytes --]

  reply	other threads:[~2017-06-18  5:49 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-06-16 15:36 ob-clojure evaluate error when Org-mode buffer has ns clojure code numbchild
2017-06-17  1:46 ` Tim Cross
2017-06-17 12:57   ` numbchild
2017-06-17 13:26     ` numbchild
2017-06-18  1:10     ` Tim Cross
2017-06-18  5:48       ` numbchild [this message]
2017-06-21  5:12         ` numbchild
2017-12-19  9:54           ` [UPDATE] " stardiviner
2017-12-21 10:15             ` numbchild

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAL1eYu+Q7JRFEDv2y=p23EiEKPptyWTD_eh=2pHKFqOeR2it+g@mail.gmail.com' \
    --to=numbchild@gmail.com \
    --cc=emacs-orgmode@gnu.org \
    --cc=theophilusx@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).