aboutsummaryrefslogtreecommitdiffstats
path: root/lisp/org/ob-clojure.el
diff options
context:
space:
mode:
Diffstat (limited to 'lisp/org/ob-clojure.el')
-rw-r--r--lisp/org/ob-clojure.el106
1 files changed, 93 insertions, 13 deletions
diff --git a/lisp/org/ob-clojure.el b/lisp/org/ob-clojure.el
index b99035b4cce..b49bfe58898 100644
--- a/lisp/org/ob-clojure.el
+++ b/lisp/org/ob-clojure.el
@@ -2,7 +2,7 @@
2 2
3;; Copyright (C) 2009-2017 Free Software Foundation, Inc. 3;; Copyright (C) 2009-2017 Free Software Foundation, Inc.
4 4
5;; Author: Joel Boehland, Eric Schulte, Oleh Krehel 5;; Author: Joel Boehland, Eric Schulte, Oleh Krehel, Frederick Giasson
6;; 6;;
7;; Keywords: literate programming, reproducible research 7;; Keywords: literate programming, reproducible research
8;; Homepage: http://orgmode.org 8;; Homepage: http://orgmode.org
@@ -43,19 +43,34 @@
43(require 'ob) 43(require 'ob)
44 44
45(declare-function cider-current-connection "ext:cider-client" (&optional type)) 45(declare-function cider-current-connection "ext:cider-client" (&optional type))
46(declare-function cider-current-session "ext:cider-client" ()) 46(declare-function cider-current-ns "ext:cider-client" ())
47(declare-function nrepl--merge "ext:nrepl-client" (dict1 dict2))
47(declare-function nrepl-dict-get "ext:nrepl-client" (dict key)) 48(declare-function nrepl-dict-get "ext:nrepl-client" (dict key))
49(declare-function nrepl-dict-put "ext:nrepl-client" (dict key value))
50(declare-function nrepl-request:eval "ext:nrepl-client"
51 (input callback connection &optional session ns line column additional-params))
48(declare-function nrepl-sync-request:eval "ext:nrepl-client" 52(declare-function nrepl-sync-request:eval "ext:nrepl-client"
49 (input connection session &optional ns)) 53 (input connection session &optional ns))
50(declare-function org-trim "org" (s &optional keep-lead)) 54(declare-function org-trim "org" (s &optional keep-lead))
51(declare-function slime-eval "ext:slime" (sexp &optional package)) 55(declare-function slime-eval "ext:slime" (sexp &optional package))
52 56
57(defvar nrepl-sync-request-timeout)
58
53(defvar org-babel-tangle-lang-exts) 59(defvar org-babel-tangle-lang-exts)
54(add-to-list 'org-babel-tangle-lang-exts '("clojure" . "clj")) 60(add-to-list 'org-babel-tangle-lang-exts '("clojure" . "clj"))
55 61
56(defvar org-babel-default-header-args:clojure '()) 62(defvar org-babel-default-header-args:clojure '())
57(defvar org-babel-header-args:clojure '((package . :any))) 63(defvar org-babel-header-args:clojure '((package . :any)))
58 64
65(defcustom org-babel-clojure-sync-nrepl-timeout 10
66 "Timeout value, in seconds, of a Clojure sync call.
67If the value is nil, timeout is disabled."
68 :group 'org-babel
69 :type 'integer
70 :version "26.1"
71 :package-version '(Org . "9.1")
72 :safe #'wholenump)
73
59(defcustom org-babel-clojure-backend 74(defcustom org-babel-clojure-backend
60 (cond ((featurep 'cider) 'cider) 75 (cond ((featurep 'cider) 'cider)
61 (t 'slime)) 76 (t 'slime))
@@ -84,21 +99,86 @@
84 body))) 99 body)))
85 100
86(defun org-babel-execute:clojure (body params) 101(defun org-babel-execute:clojure (body params)
87 "Execute a block of Clojure code with Babel." 102 "Execute a block of Clojure code with Babel.
103The underlying process performed by the code block can be output
104using the :show-process parameter."
88 (let ((expanded (org-babel-expand-body:clojure body params)) 105 (let ((expanded (org-babel-expand-body:clojure body params))
89 result) 106 (response (list 'dict))
107 result)
90 (cl-case org-babel-clojure-backend 108 (cl-case org-babel-clojure-backend
91 (cider 109 (cider
92 (require 'cider) 110 (require 'cider)
93 (let ((result-params (cdr (assq :result-params params)))) 111 (let ((result-params (cdr (assq :result-params params)))
94 (setq result 112 (show (cdr (assq :show-process params))))
95 (nrepl-dict-get 113 (if (member show '(nil "no"))
96 (nrepl-sync-request:eval 114 ;; Run code without showing the process.
97 expanded (cider-current-connection) (cider-current-session)) 115 (progn
98 (if (or (member "output" result-params) 116 (setq response
99 (member "pp" result-params)) 117 (let ((nrepl-sync-request-timeout
100 "out" 118 org-babel-clojure-sync-nrepl-timeout))
101 "value"))))) 119 (nrepl-sync-request:eval expanded
120 (cider-current-connection)
121 (cider-current-ns))))
122 (setq result
123 (concat
124 (nrepl-dict-get response
125 (if (or (member "output" result-params)
126 (member "pp" result-params))
127 "out"
128 "value"))
129 (nrepl-dict-get response "ex")
130 (nrepl-dict-get response "root-ex")
131 (nrepl-dict-get response "err"))))
132 ;; Show the process in an output buffer/window.
133 (let ((process-buffer (switch-to-buffer-other-window
134 "*Clojure Show Process Sub Buffer*"))
135 status)
136 ;; Run the Clojure code in nREPL.
137 (nrepl-request:eval
138 expanded
139 (lambda (resp)
140 (when (member "out" resp)
141 ;; Print the output of the nREPL in the output buffer.
142 (princ (nrepl-dict-get resp "out") process-buffer))
143 (when (member "ex" resp)
144 ;; In case there is an exception, then add it to the
145 ;; output buffer as well.
146 (princ (nrepl-dict-get resp "ex") process-buffer)
147 (princ (nrepl-dict-get resp "root-ex") process-buffer))
148 (when (member "err" resp)
149 ;; In case there is an error, then add it to the
150 ;; output buffer as well.
151 (princ (nrepl-dict-get resp "err") process-buffer))
152 (nrepl--merge response resp)
153 ;; Update the status of the nREPL output session.
154 (setq status (nrepl-dict-get response "status")))
155 (cider-current-connection)
156 (cider-current-ns))
157
158 ;; Wait until the nREPL code finished to be processed.
159 (while (not (member "done" status))
160 (nrepl-dict-put response "status" (remove "need-input" status))
161 (accept-process-output nil 0.01)
162 (redisplay))
163
164 ;; Delete the show buffer & window when the processing is
165 ;; finalized.
166 (mapc #'delete-window
167 (get-buffer-window-list process-buffer nil t))
168 (kill-buffer process-buffer)
169
170 ;; Put the output or the value in the result section of
171 ;; the code block.
172 (setq result
173 (concat
174 (nrepl-dict-get response
175 (if (or (member "output" result-params)
176 (member "pp" result-params))
177 "out"
178 "value"))
179 (nrepl-dict-get response "ex")
180 (nrepl-dict-get response "root-ex")
181 (nrepl-dict-get response "err")))))))
102 (slime 182 (slime
103 (require 'slime) 183 (require 'slime)
104 (with-temp-buffer 184 (with-temp-buffer