emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] ob-clojure.el: Add support for babashka and nbb backend


From: Daniel Kraus
Subject: [PATCH] ob-clojure.el: Add support for babashka and nbb backend
Date: Sun, 14 Nov 2021 16:28:01 +0100

* lisp/ob-clojure.el: Add support for babashka and nbb backend.
---
This adds support to ob-clojure for babashka 
(https://github.com/babashka/babashka)
and nbb (node version of babashka).
It doesn't use `params` as I'm not really sure what they're used for and
if they're important for evaluation.

I'm also new to org development and the git email workflow so any feedback
to the code or the email patch etc is appreciated.

 lisp/ob-clojure.el | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/lisp/ob-clojure.el b/lisp/ob-clojure.el
index 3b995d94c..dc42daa5c 100644
--- a/lisp/ob-clojure.el
+++ b/lisp/ob-clojure.el
@@ -36,6 +36,8 @@
 ;; For clojure-mode, see https://github.com/clojure-emacs/clojure-mode
 ;; For cider, see https://github.com/clojure-emacs/cider
 ;; For inf-clojure, see https://github.com/clojure-emacs/cider
+;; For babashka, see https://github.com/babashka/babashka
+;; For nbb, see https://github.com/babashka/nbb
 
 ;; For SLIME, the best way to install these components is by following
 ;; the directions as set out by Phil Hagelberg (Technomancy) on the
@@ -73,6 +75,8 @@
          (const :tag "inf-clojure" inf-clojure)
          (const :tag "cider" cider)
          (const :tag "slime" slime)
+         (const :tag "babashka" babashka)
+         (const :tag "nbb" nbb)
          (const :tag "Not configured yet" nil)))
 
 (defcustom org-babel-clojure-default-ns "user"
@@ -80,6 +84,16 @@
   :type 'string
   :group 'org-babel)
 
+(defcustom ob-clojure-babashka-command (executable-find "bb")
+  "Path to the babashka executable."
+  :type 'file
+  :group 'org-babel)
+
+(defcustom ob-clojure-nbb-command (executable-find "nbb")
+  "Path to the nbb executable."
+  :type 'file
+  :group 'org-babel)
+
 (defun org-babel-expand-body:clojure (body params)
   "Expand BODY according to PARAMS, return the expanded body."
   (let* ((vars (org-babel--get-vars params))
@@ -225,6 +239,16 @@
        ,(buffer-substring-no-properties (point-min) (point-max)))
      (cdr (assq :package params)))))
 
+(defun ob-clojure-escape-quotes (str-val)
+  "Escape quotes for STR-VAL."
+  (replace-regexp-in-string "\"" "\\\"" str-val 'FIXEDCASE 'LITERAL))
+
+(defun ob-clojure-eval-with-babashka (bb expanded)
+  "Evaluate EXPANDED code block using BB (babashka or nbb)."
+  (let ((escaped (ob-clojure-escape-quotes expanded)))
+    (shell-command-to-string
+     (concat bb " -e \"" escaped "\""))))
+
 (defun org-babel-execute:clojure (body params)
   "Execute a block of Clojure code with Babel."
   (unless org-babel-clojure-backend
@@ -236,6 +260,10 @@
          (cond
           ((eq org-babel-clojure-backend 'inf-clojure)
            (ob-clojure-eval-with-inf-clojure expanded params))
+           ((eq org-babel-clojure-backend 'babashka)
+           (ob-clojure-eval-with-babashka ob-clojure-babashka-command 
expanded))
+           ((eq org-babel-clojure-backend 'nbb)
+           (ob-clojure-eval-with-babashka ob-clojure-nbb-command expanded))
           ((eq org-babel-clojure-backend 'cider)
            (ob-clojure-eval-with-cider expanded params))
           ((eq org-babel-clojure-backend 'slime)
-- 
2.33.1





reply via email to

[Prev in Thread] Current Thread [Next in Thread]