** Bootstrapping

Excuse me while I tie my computating environment to my text editing environment.

#+BEGIN_SRC elisp
  ;; Run a clojure process listening on a socket
  (let* ((args '("-J-Dclojure.server.repl={:port,9457,:accept,clojure.core.server/repl}"))
         (clojure-program "clojure")
         (buffer (get-buffer-create "*clojure*"))
         (proc-alive (comint-check-proc buffer))
         (process (get-buffer-process buffer)))
    (unless proc-alive
      (with-current-buffer buffer
        (apply 'make-comint-in-buffer "Clojure" buffer clojure-program nil args)))
    (when buffer
      (pop-to-buffer buffer)))
#+END_SRC


#+BEGIN_SRC elisp
  ;; tell org babel to evaluate clojure code by sending it to that socket
  (defun org-babel-execute:clojure (body params)
    "Execute a block of clojure code with org-babel."
    (org-babel-eval "nc localhost 9457" body))
#+END_SRC


#+RESULTS:
: org-babel-execute:clojure


#+BEGIN_SRC clojure
  ;; use org-babel to run some clojure code to start a slightly
  ;; different repl on a different port because I don't like how the
  ;; prompt is printed in the default
  (future
    (with-open [sock (java.net.ServerSocket. 32466)]
      (loop []
        (try
          (with-open [s (.accept sock)
                      i (clojure.lang.LineNumberingPushbackReader.
                         ((requiring-resolve 'clojure.java.io/reader) (.getInputStream s)))
                      o ((requiring-resolve 'clojure.java.io/writer) (.getOutputStream s))]
            (binding [*in* i
                      ,*out* o
                      ,*err* o]
              ((requiring-resolve 'clojure.main/repl)
               :prompt (constantly nil))))
          (catch Throwable t
            (prn t)))
        (recur))))
#+END_SRC

#+RESULTS:
: user=> user=> user=> user=> #object[clojure.core$future_call$reify__8544 0x185ff04f {:status :pending, :val nil}]
: user=> 

#+BEGIN_SRC elisp :exports both
  ;; redefine this to use the new port
  (defun org-babel-execute:clojure (body params)
    "Execute a block of clojure code with org-babel."
    (org-babel-eval "nc localhost 32466" body))
#+END_SRC

#+RESULTS:
: org-babel-execute:clojure

#+BEGIN_SRC clojure :exports both
  "Hello World"
#+END_SRC

#+RESULTS:
: "Hello World"

Generated At 2023-06-07T09:55:36-0700 original