summaryrefslogtreecommitdiff
path: root/lisp/ob-clojure.el
diff options
context:
space:
mode:
Diffstat (limited to 'lisp/ob-clojure.el')
-rw-r--r--lisp/ob-clojure.el82
1 files changed, 51 insertions, 31 deletions
diff --git a/lisp/ob-clojure.el b/lisp/ob-clojure.el
index 78f3c6d..21a3ef8 100644
--- a/lisp/ob-clojure.el
+++ b/lisp/ob-clojure.el
@@ -2,8 +2,8 @@
;; Copyright (C) 2009-2014 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,21 +24,27 @@
;;; Commentary:
-;; Support for evaluating clojure code, relies on slime for all eval.
+;; Support for evaluating clojure code
-;;; Requirements:
+;; Requirements:
;; - clojure (at least 1.2.0)
;; - clojure-mode
-;; - slime
+;; - either cider or SLIME
-;; By far, the best way to install these components is by following
+;; For Cider, see https://github.com/clojure-emacs/cider
+
+;; For SLIME, 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
;;; Code:
(require 'ob)
+(eval-when-compile
+ (require 'cl))
+(declare-function nrepl-dict-get "ext:nrepl-client" (dict key))
+(declare-function nrepl-sync-request:eval "ext:nrepl-client" (input &optional ns session))
(declare-function slime-eval "ext:slime" (sexp &optional package))
(defvar org-babel-tangle-lang-exts)
@@ -47,6 +53,15 @@
(defvar org-babel-default-header-args:clojure '())
(defvar org-babel-header-args:clojure '((package . :any)))
+(defcustom org-babel-clojure-backend
+ (cond ((featurep 'cider) 'cider)
+ (t 'slime))
+ "Backend used to evaluate Clojure code blocks."
+ :group 'org-babel
+ :type '(choice
+ (const :tag "cider" cider)
+ (const :tag "SLIME" slime)))
+
(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)))
@@ -61,35 +76,40 @@
vars "\n ")
"]\n" body ")")
body))))
- (cond ((or (member "code" result-params) (member "pp" result-params))
- (format (concat "(let [org-mode-print-catcher (java.io.StringWriter.)] "
- "(clojure.pprint/with-pprint-dispatch clojure.pprint/%s-dispatch "
- "(clojure.pprint/pprint (do %s) org-mode-print-catcher) "
- "(str org-mode-print-catcher)))")
- (if (member "code" result-params) "code" "simple") body))
- ;; if (:results output), collect printed output
- ((member "output" result-params)
- (format "(clojure.core/with-out-str %s)" body))
- (t body))))
+ (if (or (member "code" result-params)
+ (member "pp" result-params))
+ (format "(clojure.pprint/pprint (do %s))" body)
+ body)))
(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))
- (let ((result
- (slime-eval
- `(swank:eval-and-grab-output
- ,(buffer-substring-no-properties (point-min) (point-max)))
- (cdr (assoc :package params)))))
- (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)))))))
+ (let ((expanded (org-babel-expand-body:clojure body params))
+ result)
+ (case org-babel-clojure-backend
+ (cider
+ (require 'cider)
+ (let ((result-params (cdr (assoc :result-params params))))
+ (setq result
+ (nrepl-dict-get
+ (nrepl-sync-request:eval expanded)
+ (if (or (member "output" result-params)
+ (member "pp" result-params))
+ "out"
+ "value")))))
+ (slime
+ (require 'slime)
+ (with-temp-buffer
+ (insert expanded)
+ (setq result
+ (slime-eval
+ `(swank:eval-and-grab-output
+ ,(buffer-substring-no-properties (point-min) (point-max)))
+ (cdr (assoc :package params)))))))
+ (org-babel-result-cond (cdr (assoc :result-params params))
+ result
+ (condition-case nil (org-babel-script-escape result)
+ (error result)))))
(provide 'ob-clojure)
-
-
;;; ob-clojure.el ends here