Function: org-babel-expand-body:clojure

org-babel-expand-body:clojure is a byte-compiled function defined in ob-clojure.el.gz.

Signature

(org-babel-expand-body:clojure BODY PARAMS &optional CLJS-P)

Documentation

Expand BODY according to PARAMS, return the expanded body.

When CLJS-P is non-nil, expand in a cljs context instead of clj.

Source Code

;; Defined in /usr/src/emacs/lisp/org/ob-clojure.el.gz
(defun org-babel-expand-body:clojure (body params &optional cljs-p)
  "Expand BODY according to PARAMS, return the expanded body.
When CLJS-P is non-nil, expand in a cljs context instead of clj."
  (let* ((vars (org-babel--get-vars params))
         (backend-override (cdr (assq :backend params)))
         (org-babel-clojure-backend
          (cond
           (backend-override (intern backend-override))
           (org-babel-clojure-backend org-babel-clojure-backend)
           (t (user-error "You need to customize `org-babel-clojure-backend'
or set the `:backend' header argument"))))
	 (ns (or (cdr (assq :ns params))
		 (if (eq org-babel-clojure-backend 'cider)
		     (or cider-buffer-ns
			 (let ((repl-buf (cider-current-connection)))
			   (and repl-buf (buffer-local-value
					  'cider-buffer-ns repl-buf))))
		   org-babel-clojure-default-ns)))
	 (result-params (cdr (assq :result-params params)))
	 (print-level nil)
	 (print-length nil)
	 ;; Remove comments, they break (let [...] ...) bindings
	 (body (replace-regexp-in-string "^[    ]*;+.*$" "" body))
	 (body (org-trim
		(concat
		 ;; Source block specified namespace :ns.
		 (and (cdr (assq :ns params)) (format "(ns %s)\n" ns))
		 ;; Variables binding.
		 (if (null vars) (org-trim body)
		   (format "(let [%s]\n%s)"
			   (mapconcat
			    (lambda (var)
			      (format "%S '%S" (car var) (cdr var)))
			    vars
			    "\n      ")
			   body))))))
    ;; If the result param is set to "output" we don't have to do
    ;; anything special and just let the backend handle everything
    (if (member "output" result-params)
        body

      ;; If the result is not "output" (i.e. it's "value"), disable
      ;; stdout output and print the last returned value.  Use pprint
      ;; instead of prn when results param is "pp" or "code".
      (concat
       (if (or (member "code" result-params)
	       (member "pp" result-params))
           (concat (if cljs-p
                       "(require '[cljs.pprint :refer [pprint]])"
                     "(require '[clojure.pprint :refer [pprint]])")
                   " (pprint ")
         "(prn ")
       (if cljs-p
           "(binding [cljs.core/*print-fn* (constantly nil)]"
         "(binding [*out* (java.io.StringWriter.)]")
       body "))"))))