user.clj, nrepl -> socket repl

This commit is contained in:
Nikita Prokopov 2024-01-02 16:26:37 +01:00
parent f064e54c06
commit 747fab5be7
6 changed files with 84 additions and 12 deletions

1
.gitignore vendored
View File

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

72
clojure/user.clj Normal file
View File

@ -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})))

View File

@ -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"}}}

View File

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

View File

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

6
script/repl.sh Executable file
View File

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