Browse Source

user.clj, nrepl -> socket repl

Nikita Prokopov 1 year ago
parent
commit
747fab5be7
6 changed files with 84 additions and 12 deletions
  1. 1 0
      .gitignore
  2. 72 0
      clojure/user.clj
  3. 4 8
      deps.edn
  4. 1 1
      script/check_widths
  5. 0 3
      script/nrepl.sh
  6. 6 0
      script/repl.sh

+ 1 - 0
.gitignore

@@ -2,6 +2,7 @@
 target
 clojure/*.edn
 .cpcache
+.repl-port
 master_ufo
 instance_ufo
 venv

+ 72 - 0
clojure/user.clj

@@ -0,0 +1,72 @@
+(ns user
+  (:require
+    [clojure.core.server :as server]
+    [clojure.java.io :as io]
+    [clojure.tools.namespace.repl :as ns]
+    [clojure.tools.namespace.track :as track]))
+
+(ns/disable-reload!)
+
+(ns/set-refresh-dirs "clojure")
+
+(def *reloaded
+  (atom nil))
+
+(add-watch #'ns/refresh-tracker ::watch
+  (fn [_ _ old new]
+    (when (empty? (::track/load new))
+      (reset! *reloaded (::track/load old)))))
+
+(defn after-reload []
+  (let [cnt (count @*reloaded)]
+    (str "Reloaded " cnt " namespace" (when (> cnt 1) "s"))))
+
+(defn reload []
+  (set! *warn-on-reflection* true)
+  ; (set! *unchecked-math* :warn-on-boxed)
+  (let [res (ns/refresh :after 'user/after-reload)]
+    (if (instance? Throwable res)
+      (throw res)
+      res)))
+
+(def p-lock
+  (Object.))
+
+(defn p-pos []
+  (let [trace (->> (Thread/currentThread)
+                (.getStackTrace)
+                (seq))
+        el    ^StackTraceElement (nth trace 4)]
+    (str "[" (clojure.lang.Compiler/demunge (.getClassName el)) " " (.getFileName el) ":" (.getLineNumber el) "]")))
+
+(defn p-impl [position form res]
+  (let [form (clojure.walk/postwalk
+               (fn [form]
+                 (if (and
+                       (list? form)
+                       (= 'user/p-impl (first form)))
+                   (clojure.lang.TaggedLiteral/create 'p (nth form 3))
+                   form))
+               form)]
+    (locking p-lock
+      (println (str position " #p " form " => " (pr-str res))))
+    res))
+
+(defn p [form]
+  `(p-impl (p-pos) '~form ~form))
+
+(defn -main [& args]
+  ;; setup repl
+  (let [args (apply array-map args)
+        port (or
+               (some-> (get args "--port") parse-long)
+               (+ 1024 (rand-int 64512)))
+        file (io/file ".repl-port")]
+    (println "Started Server Socket REPL on port" port)
+    (spit file port)
+    (.deleteOnExit file)
+    (server/start-server
+      {:name          "repl"
+       :port          port
+       :accept        'clojure.core.server/repl
+       :server-daemon false})))

+ 4 - 8
deps.edn

@@ -1,9 +1,5 @@
 {:paths ["clojure"]
- :deps {org.clojure/clojure  {:mvn/version "1.10.1"}
-        org.flatland/ordered {:mvn/version "1.5.7"}
-        fipp/fipp            {:mvn/version "0.6.18"}}
- :aliases {
-   :nrepl {
-     :extra-deps {
-       nrepl/nrepl {:mvn/version "0.8.3"}
-}}}}
+ :deps {org.clojure/clojure         {:mvn/version "1.11.1"}
+        org.flatland/ordered        {:mvn/version "1.5.7"}
+        fipp/fipp                   {:mvn/version "0.6.18"}
+        org.clojure/tools.namespace {:mvn/version "1.3.0"}}}

+ 1 - 1
script/check_widths

@@ -1,3 +1,3 @@
 #!/bin/zsh -euo pipefail
 
-clojure -m fira-code.checks
+clojure -m fira-code.checks $@

+ 0 - 3
script/nrepl.sh

@@ -1,3 +0,0 @@
-#!/bin/bash
-
-clj -A:nrepl -M -m nrepl.cmdline --interactive

+ 6 - 0
script/repl.sh

@@ -0,0 +1,6 @@
+#!/bin/bash
+set -o errexit -o nounset -o pipefail
+dir=`dirname $0`
+cd $dir/..
+
+clojure -M -m user