emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
* ob-clojure.el alternative using nrepl
@ 2013-10-03 15:45 Oleh
  2013-10-03 15:46 ` Oleh
  2013-10-03 15:54 ` Bastien
  0 siblings, 2 replies; 11+ messages in thread
From: Oleh @ 2013-10-03 15:45 UTC (permalink / raw)
  To: org mode

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

Hi all,

Current method of clojure evaluation is through slime.
I couldn't get it to work, when I tried long ago.
So I attach one that uses nrepl.
Switching between the two should be as easy as using

(require 'ob-clojure)
or
(require 'ob-clojure-nrepl).

regards,
Oleh

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

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: ob-clojure.el alternative using nrepl
  2013-10-03 15:45 ob-clojure.el alternative using nrepl Oleh
@ 2013-10-03 15:46 ` Oleh
  2013-10-03 15:54 ` Bastien
  1 sibling, 0 replies; 11+ messages in thread
From: Oleh @ 2013-10-03 15:46 UTC (permalink / raw)
  To: org mode


[-- Attachment #1.1: Type: text/plain, Size: 408 bytes --]

I guess that I forgot the attachment.

Oleh


On Thu, Oct 3, 2013 at 5:45 PM, Oleh <ohwoeowho@gmail.com> wrote:

> Hi all,
>
> Current method of clojure evaluation is through slime.
> I couldn't get it to work, when I tried long ago.
> So I attach one that uses nrepl.
> Switching between the two should be as easy as using
>
> (require 'ob-clojure)
> or
> (require 'ob-clojure-nrepl).
>
> regards,
> Oleh
>

[-- Attachment #1.2: Type: text/html, Size: 876 bytes --]

[-- Attachment #2: 0001-ob-clojure-nrepl.el-Added-nrepl-alternative-to-ob-cl.patch --]
[-- Type: application/octet-stream, Size: 2532 bytes --]

From e9e8b9c7b4b1aa9ee132e8a1a9a9d2df1898ba4b Mon Sep 17 00:00:00 2001
From: Oleh Krehel <ohwoeowho@gmail.com>
Date: Thu, 3 Oct 2013 17:37:14 +0200
Subject: [PATCH] ob-clojure-nrepl.el: Added nrepl alternative to
 ob-clojure.el.

---
 lisp/ob-clojure-nrepl.el | 59 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 59 insertions(+)
 create mode 100644 lisp/ob-clojure-nrepl.el

diff --git a/lisp/ob-clojure-nrepl.el b/lisp/ob-clojure-nrepl.el
new file mode 100644
index 0000000..cfae57d
--- /dev/null
+++ b/lisp/ob-clojure-nrepl.el
@@ -0,0 +1,59 @@
+;;; ob-clojure.el --- org-babel functions for clojure evaluation
+
+;; Copyright (C) 2009-2013 Free Software Foundation, Inc.
+
+;; Author: Oleh Krehel
+;; Keywords: literate programming, reproducible research
+;; Homepage: http://orgmode.org
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;; support for evaluating clojure code, relies on nrepl for eval
+
+;;; Requirements:
+
+;;; - clojure
+;;; - clojure-mode
+;;; - nrepl
+
+;;; Best way to get clojure is with https://github.com/technomancy/leiningen
+;;; Best way to get nrepl is from MELPA (clojure-mode is a dependency).
+
+;;; Code:
+(require 'ob)
+(require 'ob-tangle)
+
+(defvar org-babel-tangle-lang-exts)
+(add-to-list 'org-babel-tangle-lang-exts '("clojure" . "clj"))
+
+(defvar org-babel-default-header-args:clojure
+  '((:results . "value") (:tangle . "yes")))
+
+(defun org-babel-execute:clojure (body params)
+  "Execute a block of Clojure code with Babel and nREPL."
+  (require 'nrepl)
+  (if (nrepl-current-connection-buffer)
+      (let* ((result (nrepl-eval body))
+             (s (plist-get result :stdout))
+             (r (plist-get result :value)))
+        (if s (concat s "\n" r) r))
+    (error "nREPL not connected! Use M-x nrepl-jack-in.")))
+
+(provide 'ob-clojure-nrepl)
+
+;;; ob-clojure-nrepl.el ends here
-- 
1.8.4


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: ob-clojure.el alternative using nrepl
  2013-10-03 15:45 ob-clojure.el alternative using nrepl Oleh
  2013-10-03 15:46 ` Oleh
@ 2013-10-03 15:54 ` Bastien
       [not found]   ` <CAA01p3rUCr=Q+7QORn_6EEjqqY0SKpKU=0FvRj9-kmDGs=-43w@mail.gmail.com>
  1 sibling, 1 reply; 11+ messages in thread
From: Bastien @ 2013-10-03 15:54 UTC (permalink / raw)
  To: Oleh; +Cc: org mode

Hi Oleh,

Oleh <ohwoeowho@gmail.com> writes:

> Current method of clojure evaluation is through slime.
> I couldn't get it to work, when I tried long ago.
> So I attach one that uses nrepl.
> Switching between the two should be as easy as using
>
> (require 'ob-clojure)
> or
> (require 'ob-clojure-nrepl).

Nice, something needed.  I guess we should rather have an option for
this in ob-clojure.el, letting users decide whether they want to use
nrepl.el or slime, a sensible default being to use nrepl.el.

What do you think?

-- 
 Bastien

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: ob-clojure.el alternative using nrepl
       [not found]     ` <87hacynx1l.fsf@bzg.ath.cx>
@ 2013-10-03 16:27       ` Oleh
  2013-10-03 18:06         ` Eric Schulte
  0 siblings, 1 reply; 11+ messages in thread
From: Oleh @ 2013-10-03 16:27 UTC (permalink / raw)
  To: Bastien; +Cc: org mode


[-- Attachment #1.1: Type: text/plain, Size: 479 bytes --]

Here's an updated patch.
I use defalias, is that OK?

Oleh


On Thu, Oct 3, 2013 at 6:23 PM, Bastien <bzg@gnu.org> wrote:

> Hi Oleh,
>
> Oleh <ohwoeowho@gmail.com> writes:
>
> > Should I rather put the code in ob-clojure.el with something like
> > (defcustom ob-clojure-method nrepl)?
>
> Yes, I think it's better.  Maybe
>
> (defcustom ob-clojure-repl 'nrepl)
>
> Let's discuss this on the list so that others can chime in.
>
> Thanks for bringing this up!
>
> --
>  Bastien
>

[-- Attachment #1.2: Type: text/html, Size: 1031 bytes --]

[-- Attachment #2: 0001-ob-clojure.el-switch-to-nREPL-as-the-main-method-of-.patch --]
[-- Type: application/octet-stream, Size: 2751 bytes --]

From ab5c9a8844b4103e40cd4c135f297a7089cd7cdf Mon Sep 17 00:00:00 2001
From: Oleh Krehel <ohwoeowho@gmail.com>
Date: Thu, 3 Oct 2013 18:23:16 +0200
Subject: [PATCH] ob-clojure.el: switch to nREPL as the main method of
 evaluating Clojure.

Get the old behavior with:
(defalias 'org-babel-execute:clojure 'org-babel--execute-clojure-slime)
---
 lisp/ob-clojure.el | 34 ++++++++++++++++++++++++++--------
 1 file changed, 26 insertions(+), 8 deletions(-)

diff --git a/lisp/ob-clojure.el b/lisp/ob-clojure.el
index bc2bbc0..3b82f0a 100644
--- a/lisp/ob-clojure.el
+++ b/lisp/ob-clojure.el
@@ -2,8 +2,8 @@
 
 ;; Copyright (C) 2009-2013 Free Software Foundation, Inc.
 
-;; Author: Joel Boehland
-;;	Eric Schulte
+;; Author: Joel Boehland, Eric Schulte, Oleh Krehel
+;;
 ;; Keywords: literate programming, reproducible research
 ;; Homepage: http://orgmode.org
 
@@ -24,20 +24,26 @@
 
 ;;; Commentary:
 
-;;; support for evaluating clojure code, relies on slime for all eval
+;;; support for evaluating clojure code, relies either on slime or
+;;; on nrepl for all eval
 
 ;;; Requirements:
 
 ;;; - clojure (at least 1.2.0)
 ;;; - clojure-mode
-;;; - slime
+;;; - either slime or nrepl
 
-;;; By far, the best way to install these components is by following
-;;; the directions as set out by Phil Hagelberg (Technomancy) on the
-;;; web page: http://technomancy.us/126
+;;; For SLIME-way, the best way to install these components is by
+;;; following the directions as set out by Phil Hagelberg (Technomancy)
+;;; on the web page: http://technomancy.us/126
+
+;;; For nREPL-way:
+;;; get clojure is with https://github.com/technomancy/leiningen
+;;; get nrepl from MELPA (clojure-mode is a dependency).
 
 ;;; Code:
 (require 'ob)
+(require 'ob-tangle)
 
 (declare-function slime-eval "ext:slime" (sexp &optional package))
 
@@ -72,7 +78,7 @@
 	   (format "(clojure.core/with-out-str %s)" body))
 	  (t body))))
 
-(defun org-babel-execute:clojure (body params)
+(defun org-babel--execute-clojure-slime (body params)
   "Execute a block of Clojure code with Babel."
   (require 'slime)
   (with-temp-buffer
@@ -88,6 +94,18 @@
      	,(buffer-substring-no-properties (point-min) (point-max)))
       (cdr (assoc :package params))))))
 
+(defun org-babel--execute-clojure-nrepl (body params)
+  "Execute a block of Clojure code with Babel and nREPL."
+  (require 'nrepl)
+  (if (nrepl-current-connection-buffer)
+      (let* ((result (nrepl-eval body))
+             (s (plist-get result :stdout))
+             (r (plist-get result :value)))
+        (if s (concat s "\n" r) r))
+    (error "nREPL not connected! Use M-x nrepl-jack-in.")))
+
+(defalias 'org-babel-execute:clojure 'org-babel--execute-clojure-nrepl)
+
 (provide 'ob-clojure)
 
 
-- 
1.8.4


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: ob-clojure.el alternative using nrepl
  2013-10-03 16:27       ` Oleh
@ 2013-10-03 18:06         ` Eric Schulte
  2013-10-03 18:37           ` Oleh
  0 siblings, 1 reply; 11+ messages in thread
From: Eric Schulte @ 2013-10-03 18:06 UTC (permalink / raw)
  To: Oleh; +Cc: Bastien, org mode

Thanks for this update.

Oleh <ohwoeowho@gmail.com> writes:

> Here's an updated patch.
> I use defalias, is that OK?
>

Two changes.

1. instead of customization through a defalias, use defcustom and a
   variable which determines which function (eval-slime or eval-nrepl)
   is called.

2. ob-*.el files should not require ob-tangle.

If you prefer not to make these changes I can apply your patch, and then
make the required changes myself over-top.

Best,

>
> Oleh
>
>
> On Thu, Oct 3, 2013 at 6:23 PM, Bastien <bzg@gnu.org> wrote:
>
>> Hi Oleh,
>>
>> Oleh <ohwoeowho@gmail.com> writes:
>>
>> > Should I rather put the code in ob-clojure.el with something like
>> > (defcustom ob-clojure-method nrepl)?
>>
>> Yes, I think it's better.  Maybe
>>
>> (defcustom ob-clojure-repl 'nrepl)
>>
>> Let's discuss this on the list so that others can chime in.
>>
>> Thanks for bringing this up!
>>
>> --
>>  Bastien
>>
>
> From ab5c9a8844b4103e40cd4c135f297a7089cd7cdf Mon Sep 17 00:00:00 2001
> From: Oleh Krehel <ohwoeowho@gmail.com>
> Date: Thu, 3 Oct 2013 18:23:16 +0200
> Subject: [PATCH] ob-clojure.el: switch to nREPL as the main method of
>  evaluating Clojure.
>
> Get the old behavior with:
> (defalias 'org-babel-execute:clojure 'org-babel--execute-clojure-slime)
> ---
>  lisp/ob-clojure.el | 34 ++++++++++++++++++++++++++--------
>  1 file changed, 26 insertions(+), 8 deletions(-)
>
> diff --git a/lisp/ob-clojure.el b/lisp/ob-clojure.el
> index bc2bbc0..3b82f0a 100644
> --- a/lisp/ob-clojure.el
> +++ b/lisp/ob-clojure.el
> @@ -2,8 +2,8 @@
>  
>  ;; Copyright (C) 2009-2013 Free Software Foundation, Inc.
>  
> -;; Author: Joel Boehland
> -;;	Eric Schulte
> +;; Author: Joel Boehland, Eric Schulte, Oleh Krehel
> +;;
>  ;; Keywords: literate programming, reproducible research
>  ;; Homepage: http://orgmode.org
>  
> @@ -24,20 +24,26 @@
>  
>  ;;; Commentary:
>  
> -;;; support for evaluating clojure code, relies on slime for all eval
> +;;; support for evaluating clojure code, relies either on slime or
> +;;; on nrepl for all eval
>  
>  ;;; Requirements:
>  
>  ;;; - clojure (at least 1.2.0)
>  ;;; - clojure-mode
> -;;; - slime
> +;;; - either slime or nrepl
>  
> -;;; By far, the best way to install these components is by following
> -;;; the directions as set out by Phil Hagelberg (Technomancy) on the
> -;;; web page: http://technomancy.us/126
> +;;; For SLIME-way, the best way to install these components is by
> +;;; following the directions as set out by Phil Hagelberg (Technomancy)
> +;;; on the web page: http://technomancy.us/126
> +
> +;;; For nREPL-way:
> +;;; get clojure is with https://github.com/technomancy/leiningen
> +;;; get nrepl from MELPA (clojure-mode is a dependency).
>  
>  ;;; Code:
>  (require 'ob)
> +(require 'ob-tangle)
>  
>  (declare-function slime-eval "ext:slime" (sexp &optional package))
>  
> @@ -72,7 +78,7 @@
>  	   (format "(clojure.core/with-out-str %s)" body))
>  	  (t body))))
>  
> -(defun org-babel-execute:clojure (body params)
> +(defun org-babel--execute-clojure-slime (body params)
>    "Execute a block of Clojure code with Babel."
>    (require 'slime)
>    (with-temp-buffer
> @@ -88,6 +94,18 @@
>       	,(buffer-substring-no-properties (point-min) (point-max)))
>        (cdr (assoc :package params))))))
>  
> +(defun org-babel--execute-clojure-nrepl (body params)
> +  "Execute a block of Clojure code with Babel and nREPL."
> +  (require 'nrepl)
> +  (if (nrepl-current-connection-buffer)
> +      (let* ((result (nrepl-eval body))
> +             (s (plist-get result :stdout))
> +             (r (plist-get result :value)))
> +        (if s (concat s "\n" r) r))
> +    (error "nREPL not connected! Use M-x nrepl-jack-in.")))
> +
> +(defalias 'org-babel-execute:clojure 'org-babel--execute-clojure-nrepl)
> +
>  (provide 'ob-clojure)

-- 
Eric Schulte
https://cs.unm.edu/~eschulte
PGP: 0x614CA05D

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: ob-clojure.el alternative using nrepl
  2013-10-03 18:06         ` Eric Schulte
@ 2013-10-03 18:37           ` Oleh
  2013-10-03 21:47             ` Eric Schulte
  0 siblings, 1 reply; 11+ messages in thread
From: Oleh @ 2013-10-03 18:37 UTC (permalink / raw)
  To: Eric Schulte; +Cc: Bastien, org mode

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

Hi Eric,

I can make the changes tomorrow.
Or you can make them now if you like.
I required ob-tangle because it's a pre-requisite for ob-clojure:
an error is thrown if I try to load ob-clojure before ob-tangle.
So it makes sense to me to require it.

regards,
Oleh


On Thu, Oct 3, 2013 at 8:06 PM, Eric Schulte <schulte.eric@gmail.com> wrote:

> Thanks for this update.
>
> Oleh <ohwoeowho@gmail.com> writes:
>
> > Here's an updated patch.
> > I use defalias, is that OK?
> >
>
> Two changes.
>
> 1. instead of customization through a defalias, use defcustom and a
>    variable which determines which function (eval-slime or eval-nrepl)
>    is called.
>
> 2. ob-*.el files should not require ob-tangle.
>
> If you prefer not to make these changes I can apply your patch, and then
> make the required changes myself over-top.
>
> Best,
>
> >
> > Oleh
> >
> >
> > On Thu, Oct 3, 2013 at 6:23 PM, Bastien <bzg@gnu.org> wrote:
> >
> >> Hi Oleh,
> >>
> >> Oleh <ohwoeowho@gmail.com> writes:
> >>
> >> > Should I rather put the code in ob-clojure.el with something like
> >> > (defcustom ob-clojure-method nrepl)?
> >>
> >> Yes, I think it's better.  Maybe
> >>
> >> (defcustom ob-clojure-repl 'nrepl)
> >>
> >> Let's discuss this on the list so that others can chime in.
> >>
> >> Thanks for bringing this up!
> >>
> >> --
> >>  Bastien
> >>
> >
> > From ab5c9a8844b4103e40cd4c135f297a7089cd7cdf Mon Sep 17 00:00:00 2001
> > From: Oleh Krehel <ohwoeowho@gmail.com>
> > Date: Thu, 3 Oct 2013 18:23:16 +0200
> > Subject: [PATCH] ob-clojure.el: switch to nREPL as the main method of
> >  evaluating Clojure.
> >
> > Get the old behavior with:
> > (defalias 'org-babel-execute:clojure 'org-babel--execute-clojure-slime)
> > ---
> >  lisp/ob-clojure.el | 34 ++++++++++++++++++++++++++--------
> >  1 file changed, 26 insertions(+), 8 deletions(-)
> >
> > diff --git a/lisp/ob-clojure.el b/lisp/ob-clojure.el
> > index bc2bbc0..3b82f0a 100644
> > --- a/lisp/ob-clojure.el
> > +++ b/lisp/ob-clojure.el
> > @@ -2,8 +2,8 @@
> >
> >  ;; Copyright (C) 2009-2013 Free Software Foundation, Inc.
> >
> > -;; Author: Joel Boehland
> > -;;   Eric Schulte
> > +;; Author: Joel Boehland, Eric Schulte, Oleh Krehel
> > +;;
> >  ;; Keywords: literate programming, reproducible research
> >  ;; Homepage: http://orgmode.org
> >
> > @@ -24,20 +24,26 @@
> >
> >  ;;; Commentary:
> >
> > -;;; support for evaluating clojure code, relies on slime for all eval
> > +;;; support for evaluating clojure code, relies either on slime or
> > +;;; on nrepl for all eval
> >
> >  ;;; Requirements:
> >
> >  ;;; - clojure (at least 1.2.0)
> >  ;;; - clojure-mode
> > -;;; - slime
> > +;;; - either slime or nrepl
> >
> > -;;; By far, the best way to install these components is by following
> > -;;; the directions as set out by Phil Hagelberg (Technomancy) on the
> > -;;; web page: http://technomancy.us/126
> > +;;; For SLIME-way, the best way to install these components is by
> > +;;; following the directions as set out by Phil Hagelberg (Technomancy)
> > +;;; on the web page: http://technomancy.us/126
> > +
> > +;;; For nREPL-way:
> > +;;; get clojure is with https://github.com/technomancy/leiningen
> > +;;; get nrepl from MELPA (clojure-mode is a dependency).
> >
> >  ;;; Code:
> >  (require 'ob)
> > +(require 'ob-tangle)
> >
> >  (declare-function slime-eval "ext:slime" (sexp &optional package))
> >
> > @@ -72,7 +78,7 @@
> >          (format "(clojure.core/with-out-str %s)" body))
> >         (t body))))
> >
> > -(defun org-babel-execute:clojure (body params)
> > +(defun org-babel--execute-clojure-slime (body params)
> >    "Execute a block of Clojure code with Babel."
> >    (require 'slime)
> >    (with-temp-buffer
> > @@ -88,6 +94,18 @@
> >               ,(buffer-substring-no-properties (point-min) (point-max)))
> >        (cdr (assoc :package params))))))
> >
> > +(defun org-babel--execute-clojure-nrepl (body params)
> > +  "Execute a block of Clojure code with Babel and nREPL."
> > +  (require 'nrepl)
> > +  (if (nrepl-current-connection-buffer)
> > +      (let* ((result (nrepl-eval body))
> > +             (s (plist-get result :stdout))
> > +             (r (plist-get result :value)))
> > +        (if s (concat s "\n" r) r))
> > +    (error "nREPL not connected! Use M-x nrepl-jack-in.")))
> > +
> > +(defalias 'org-babel-execute:clojure 'org-babel--execute-clojure-nrepl)
> > +
> >  (provide 'ob-clojure)
>
> --
> Eric Schulte
> https://cs.unm.edu/~eschulte
> PGP: 0x614CA05D
>

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

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: ob-clojure.el alternative using nrepl
  2013-10-03 18:37           ` Oleh
@ 2013-10-03 21:47             ` Eric Schulte
  2013-10-03 21:56               ` Bastien
  0 siblings, 1 reply; 11+ messages in thread
From: Eric Schulte @ 2013-10-03 21:47 UTC (permalink / raw)
  To: Oleh; +Cc: Bastien, org mode

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

Oleh <ohwoeowho@gmail.com> writes:

> Hi Eric,
>
> I can make the changes tomorrow.
> Or you can make them now if you like.

Please try out the attached patch which may be applied overtop of your
patch and let me know if it works?  I had to guess at the two nrepl
function arguments.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0002-ob-clojure-nrepl-customization-variable.patch --]
[-- Type: text/x-diff, Size: 3788 bytes --]

From ee6c792ec7657e50524d78d309538e7e58bb2989 Mon Sep 17 00:00:00 2001
From: Eric Schulte <schulte.eric@gmail.com>
Date: Thu, 3 Oct 2013 13:25:46 -0600
Subject: [PATCH 2/2] ob-clojure nrepl customization variable

  - ensure body is expanded for n-repl as well
  - declare n-repl functions
  - remove require ob-tangle from ob-clojure

* lisp/ob-clojure.el (org-babel-clojure-backend): Customization
  variable to select clojure backend
  (nrepl-eval): Declared function.
  (nrepl-current-connection-buffer): Declared function.
  (org-babel-execute:clojure): Execution now uses customized backend.
---
 lisp/ob-clojure.el | 59 +++++++++++++++++++++++++++++-------------------------
 1 file changed, 32 insertions(+), 27 deletions(-)

diff --git a/lisp/ob-clojure.el b/lisp/ob-clojure.el
index 3b82f0a..255fe8d 100644
--- a/lisp/ob-clojure.el
+++ b/lisp/ob-clojure.el
@@ -43,9 +43,10 @@
 
 ;;; Code:
 (require 'ob)
-(require 'ob-tangle)
 
 (declare-function slime-eval "ext:slime" (sexp &optional package))
+(declare-function nrepl-current-connection-buffer "ext:nrepl" ())
+(declare-function nrepl-eval "ext:nrepl" (body))
 
 (defvar org-babel-tangle-lang-exts)
 (add-to-list 'org-babel-tangle-lang-exts '("clojure" . "clj"))
@@ -53,6 +54,11 @@
 (defvar org-babel-default-header-args:clojure '())
 (defvar org-babel-header-args:clojure '((package . :any)))
 
+(defcustom org-babel-clojure-backend 'nrepl
+  "Backend used to evaluate Clojure code blocks."
+  :group 'org-babel
+  :type 'symbol)
+
 (defun org-babel-expand-body:clojure (body params)
   "Expand BODY according to PARAMS, return the expanded body."
   (let* ((vars (mapcar #'cdr (org-babel-get-header params :var)))
@@ -78,33 +84,32 @@
 	   (format "(clojure.core/with-out-str %s)" body))
 	  (t body))))
 
-(defun org-babel--execute-clojure-slime (body params)
+(defun org-babel-execute:clojure (body params)
   "Execute a block of Clojure code with Babel."
-  (require 'slime)
-  (with-temp-buffer
-    (insert (org-babel-expand-body:clojure body params))
-    ((lambda (result)
-       (let ((result-params (cdr (assoc :result-params params))))
-	 (org-babel-result-cond result-params
-	   result
-	   (condition-case nil (org-babel-script-escape result)
-	     (error result)))))
-     (slime-eval
-      `(swank:eval-and-grab-output
-     	,(buffer-substring-no-properties (point-min) (point-max)))
-      (cdr (assoc :package params))))))
-
-(defun org-babel--execute-clojure-nrepl (body params)
-  "Execute a block of Clojure code with Babel and nREPL."
-  (require 'nrepl)
-  (if (nrepl-current-connection-buffer)
-      (let* ((result (nrepl-eval body))
-             (s (plist-get result :stdout))
-             (r (plist-get result :value)))
-        (if s (concat s "\n" r) r))
-    (error "nREPL not connected! Use M-x nrepl-jack-in.")))
-
-(defalias 'org-babel-execute:clojure 'org-babel--execute-clojure-nrepl)
+  (let ((expanded (org-babel-expand-body:clojure body params)))
+    (case org-babel-clojure-backend
+      (slime
+       (require 'slime)
+       (with-temp-buffer
+	 (insert expanded)
+	 ((lambda (result)
+	    (let ((result-params (cdr (assoc :result-params params))))
+	      (org-babel-result-cond result-params
+		result
+		(condition-case nil (org-babel-script-escape result)
+		  (error result)))))
+	  (slime-eval
+	   `(swank:eval-and-grab-output
+	     ,(buffer-substring-no-properties (point-min) (point-max)))
+	   (cdr (assoc :package params))))))
+      (nrepl
+       (require 'nrepl)
+       (if (nrepl-current-connection-buffer)
+	   (let* ((result (nrepl-eval expanded))
+		  (s (plist-get result :stdout))
+		  (r (plist-get result :value)))
+	     (if s (concat s "\n" r) r))
+	 (error "nREPL not connected! Use M-x nrepl-jack-in."))))))
 
 (provide 'ob-clojure)
 
-- 
1.8.4


[-- Attachment #3: Type: text/plain, Size: 4795 bytes --]


> 
> I required ob-tangle because it's a pre-requisite for ob-clojure: an
> error is thrown if I try to load ob-clojure before ob-tangle.  So it
> makes sense to me to require it.
>

I don't see this.  With the latest version of Org-mode I'm able to
require ob-clojure w/o any problems when starting with no configuration
(e.g., "emacs -Q").

Cheers,

>
> regards,
> Oleh
>
>
> On Thu, Oct 3, 2013 at 8:06 PM, Eric Schulte <schulte.eric@gmail.com> wrote:
>
>> Thanks for this update.
>>
>> Oleh <ohwoeowho@gmail.com> writes:
>>
>> > Here's an updated patch.
>> > I use defalias, is that OK?
>> >
>>
>> Two changes.
>>
>> 1. instead of customization through a defalias, use defcustom and a
>>    variable which determines which function (eval-slime or eval-nrepl)
>>    is called.
>>
>> 2. ob-*.el files should not require ob-tangle.
>>
>> If you prefer not to make these changes I can apply your patch, and then
>> make the required changes myself over-top.
>>
>> Best,
>>
>> >
>> > Oleh
>> >
>> >
>> > On Thu, Oct 3, 2013 at 6:23 PM, Bastien <bzg@gnu.org> wrote:
>> >
>> >> Hi Oleh,
>> >>
>> >> Oleh <ohwoeowho@gmail.com> writes:
>> >>
>> >> > Should I rather put the code in ob-clojure.el with something like
>> >> > (defcustom ob-clojure-method nrepl)?
>> >>
>> >> Yes, I think it's better.  Maybe
>> >>
>> >> (defcustom ob-clojure-repl 'nrepl)
>> >>
>> >> Let's discuss this on the list so that others can chime in.
>> >>
>> >> Thanks for bringing this up!
>> >>
>> >> --
>> >>  Bastien
>> >>
>> >
>> > From ab5c9a8844b4103e40cd4c135f297a7089cd7cdf Mon Sep 17 00:00:00 2001
>> > From: Oleh Krehel <ohwoeowho@gmail.com>
>> > Date: Thu, 3 Oct 2013 18:23:16 +0200
>> > Subject: [PATCH] ob-clojure.el: switch to nREPL as the main method of
>> >  evaluating Clojure.
>> >
>> > Get the old behavior with:
>> > (defalias 'org-babel-execute:clojure 'org-babel--execute-clojure-slime)
>> > ---
>> >  lisp/ob-clojure.el | 34 ++++++++++++++++++++++++++--------
>> >  1 file changed, 26 insertions(+), 8 deletions(-)
>> >
>> > diff --git a/lisp/ob-clojure.el b/lisp/ob-clojure.el
>> > index bc2bbc0..3b82f0a 100644
>> > --- a/lisp/ob-clojure.el
>> > +++ b/lisp/ob-clojure.el
>> > @@ -2,8 +2,8 @@
>> >
>> >  ;; Copyright (C) 2009-2013 Free Software Foundation, Inc.
>> >
>> > -;; Author: Joel Boehland
>> > -;;   Eric Schulte
>> > +;; Author: Joel Boehland, Eric Schulte, Oleh Krehel
>> > +;;
>> >  ;; Keywords: literate programming, reproducible research
>> >  ;; Homepage: http://orgmode.org
>> >
>> > @@ -24,20 +24,26 @@
>> >
>> >  ;;; Commentary:
>> >
>> > -;;; support for evaluating clojure code, relies on slime for all eval
>> > +;;; support for evaluating clojure code, relies either on slime or
>> > +;;; on nrepl for all eval
>> >
>> >  ;;; Requirements:
>> >
>> >  ;;; - clojure (at least 1.2.0)
>> >  ;;; - clojure-mode
>> > -;;; - slime
>> > +;;; - either slime or nrepl
>> >
>> > -;;; By far, the best way to install these components is by following
>> > -;;; the directions as set out by Phil Hagelberg (Technomancy) on the
>> > -;;; web page: http://technomancy.us/126
>> > +;;; For SLIME-way, the best way to install these components is by
>> > +;;; following the directions as set out by Phil Hagelberg (Technomancy)
>> > +;;; on the web page: http://technomancy.us/126
>> > +
>> > +;;; For nREPL-way:
>> > +;;; get clojure is with https://github.com/technomancy/leiningen
>> > +;;; get nrepl from MELPA (clojure-mode is a dependency).
>> >
>> >  ;;; Code:
>> >  (require 'ob)
>> > +(require 'ob-tangle)
>> >
>> >  (declare-function slime-eval "ext:slime" (sexp &optional package))
>> >
>> > @@ -72,7 +78,7 @@
>> >          (format "(clojure.core/with-out-str %s)" body))
>> >         (t body))))
>> >
>> > -(defun org-babel-execute:clojure (body params)
>> > +(defun org-babel--execute-clojure-slime (body params)
>> >    "Execute a block of Clojure code with Babel."
>> >    (require 'slime)
>> >    (with-temp-buffer
>> > @@ -88,6 +94,18 @@
>> >               ,(buffer-substring-no-properties (point-min) (point-max)))
>> >        (cdr (assoc :package params))))))
>> >
>> > +(defun org-babel--execute-clojure-nrepl (body params)
>> > +  "Execute a block of Clojure code with Babel and nREPL."
>> > +  (require 'nrepl)
>> > +  (if (nrepl-current-connection-buffer)
>> > +      (let* ((result (nrepl-eval body))
>> > +             (s (plist-get result :stdout))
>> > +             (r (plist-get result :value)))
>> > +        (if s (concat s "\n" r) r))
>> > +    (error "nREPL not connected! Use M-x nrepl-jack-in.")))
>> > +
>> > +(defalias 'org-babel-execute:clojure 'org-babel--execute-clojure-nrepl)
>> > +
>> >  (provide 'ob-clojure)
>>
>> --
>> Eric Schulte
>> https://cs.unm.edu/~eschulte
>> PGP: 0x614CA05D
>>

-- 
Eric Schulte
https://cs.unm.edu/~eschulte
PGP: 0x614CA05D

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: ob-clojure.el alternative using nrepl
  2013-10-03 21:47             ` Eric Schulte
@ 2013-10-03 21:56               ` Bastien
  2013-10-03 22:53                 ` Eric Schulte
  0 siblings, 1 reply; 11+ messages in thread
From: Bastien @ 2013-10-03 21:56 UTC (permalink / raw)
  To: Eric Schulte; +Cc: org mode, Oleh

Hi Eric,

Eric Schulte <schulte.eric@gmail.com> writes:

> Please try out the attached patch which may be applied overtop of your
> patch and let me know if it works?  I had to guess at the two nrepl
> function arguments.

It works fine for nrepl.el, thanks a lot!

-- 
 Bastien

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: ob-clojure.el alternative using nrepl
  2013-10-03 21:56               ` Bastien
@ 2013-10-03 22:53                 ` Eric Schulte
  2013-10-04  8:26                   ` Oleh
  0 siblings, 1 reply; 11+ messages in thread
From: Eric Schulte @ 2013-10-03 22:53 UTC (permalink / raw)
  To: Bastien; +Cc: org mode, Oleh

Bastien <bzg@altern.org> writes:

> Hi Eric,
>
> Eric Schulte <schulte.eric@gmail.com> writes:
>
>> Please try out the attached patch which may be applied overtop of your
>> patch and let me know if it works?  I had to guess at the two nrepl
>> function arguments.
>
> It works fine for nrepl.el, thanks a lot!

Alright, I just pushed this up.

Thanks for testing, I haven't used Clojure in a couple of years now
(since happily moving on to Common Lisp as my lisp of choice).

Thanks to Oleh for the patch!

Cheers,

-- 
Eric Schulte
https://cs.unm.edu/~eschulte
PGP: 0x614CA05D

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: ob-clojure.el alternative using nrepl
  2013-10-03 22:53                 ` Eric Schulte
@ 2013-10-04  8:26                   ` Oleh
  2013-10-04 17:05                     ` Eric Schulte
  0 siblings, 1 reply; 11+ messages in thread
From: Oleh @ 2013-10-04  8:26 UTC (permalink / raw)
  To: Eric Schulte; +Cc: Bastien, org mode

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

Thanks, Eric.

Your changes work.

Still, I think that it's needed to require ob-tangle.
It defines the variable `org-babel-tangle-lang-exts' that ob-clojure
wants to modify right at loading. So it's impossible to load ob-clojure
unless ob-tangle was already loaded.

Just to clarify, this code will work:

(setq org-babel-tangle-lang-exts nil)
(require 'ob-clojure)

whereas

(require 'ob-clojure)

will not.

regards,
Oleh


>  Alright, I just pushed this up.
>
> Thanks for testing, I haven't used Clojure in a couple of years now
> (since happily moving on to Common Lisp as my lisp of choice).
>
> Thanks to Oleh for the patch!
>
> Cheers,
>
> --
> Eric Schulte
> https://cs.unm.edu/~eschulte
> PGP: 0x614CA05D
>

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

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: ob-clojure.el alternative using nrepl
  2013-10-04  8:26                   ` Oleh
@ 2013-10-04 17:05                     ` Eric Schulte
  0 siblings, 0 replies; 11+ messages in thread
From: Eric Schulte @ 2013-10-04 17:05 UTC (permalink / raw)
  To: Oleh; +Cc: Bastien, org mode

Oleh <ohwoeowho@gmail.com> writes:

> Thanks, Eric.
>
> Your changes work.
>

Great, thanks for the patch.

>
> Still, I think that it's needed to require ob-tangle.
> It defines the variable `org-babel-tangle-lang-exts' that ob-clojure
> wants to modify right at loading. So it's impossible to load ob-clojure
> unless ob-tangle was already loaded.
>
> Just to clarify, this code will work:
>
> (setq org-babel-tangle-lang-exts nil)
> (require 'ob-clojure)
>
> whereas
>
> (require 'ob-clojure)
>
> will not.
>

I think this must be particular to your system.  The (defvar
org-babel-tangle-lang-exts) form in ob-clojure.el should take care of
this problem, and indeed does for me.

    $ emacs --batch --eval "(progn (add-to-list 'load-path \"~/src/org-mode/lisp\") (require 'org) (require 'ob-clojure) (message \"success\"))"
    success

Cheers,

>
> regards,
> Oleh
>
>
>>  Alright, I just pushed this up.
>>
>> Thanks for testing, I haven't used Clojure in a couple of years now
>> (since happily moving on to Common Lisp as my lisp of choice).
>>
>> Thanks to Oleh for the patch!
>>
>> Cheers,
>>
>> --
>> Eric Schulte
>> https://cs.unm.edu/~eschulte
>> PGP: 0x614CA05D
>>

-- 
Eric Schulte
https://cs.unm.edu/~eschulte
PGP: 0x614CA05D

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2013-10-04 17:06 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-10-03 15:45 ob-clojure.el alternative using nrepl Oleh
2013-10-03 15:46 ` Oleh
2013-10-03 15:54 ` Bastien
     [not found]   ` <CAA01p3rUCr=Q+7QORn_6EEjqqY0SKpKU=0FvRj9-kmDGs=-43w@mail.gmail.com>
     [not found]     ` <87hacynx1l.fsf@bzg.ath.cx>
2013-10-03 16:27       ` Oleh
2013-10-03 18:06         ` Eric Schulte
2013-10-03 18:37           ` Oleh
2013-10-03 21:47             ` Eric Schulte
2013-10-03 21:56               ` Bastien
2013-10-03 22:53                 ` Eric Schulte
2013-10-04  8:26                   ` Oleh
2013-10-04 17:05                     ` Eric Schulte

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).