Closed sbondaryev closed 6 years ago
So if you look at the responses and take note of the :session
key value. Notice how they are all different. In this case you can think of this as sending operations to different REPLs.
If you want to talk to the cljs repl you will have to talk to that session.
This easiest way to get a stable session is to take the client and make a session client out of it. Then when you send your messages to that client they are all going "to the same repl" (actually you are speaking to different threads with isolated bindings).
(def conn (nrepl/connect :port 7888))
(def client (nrepl/client conn 1000))
(def sess1 (nrepl/client-session client))
(def sess2 (nrepl/client-session client))
;; now you will send things to the different sessions and you will notice the session id stays stable
(nrepl/message sess1 {:op :eval :code "(list 1 2 3)"})
(nrepl/message sess2 {:op :eval :code "(list 1 2 3)"})
And you will need to make a cljs-session for your cljs-repl. But what you have done above should work for vscode calva as you have separate sessions and one is a cljs session.
Great! Thanks @bhauman Just to make the things done - here are modified steps
Define a function to send message to nREPL
user=> (require '[clojure.tools.nrepl])
nil
user=> (defn create-messenger [port]
(let [session (-> (clojure.tools.nrepl/connect :port port)
(clojure.tools.nrepl/client 20000)
(clojure.tools.nrepl/client-session))]
#(-> (clojure.tools.nrepl/message session {:op :eval :code %})
doall
pprint)))
#'user/create-messenger
user=> (def msg (create-messenger 7888))
#'user/msg
Switch to ClojureScript nREPL
user=> (msg "(require 'cljs.repl.nashorn)")
({:id "5d92a255-9e2b-42f9-b0c8-6e8232850a61",
:ns "user",
:session "3f732512-7af4-4f56-b43f-054b1eb246b4",
:value "nil"}
{:id "5d92a255-9e2b-42f9-b0c8-6e8232850a61",
:session "3f732512-7af4-4f56-b43f-054b1eb246b4",
:status ["done"]})
nil
user=> (msg "(cider.piggieback/cljs-repl (cljs.repl.nashorn/repl-env))")
({:id "cd73345e-7078-4249-ae37-1fe2cba61be0",
:out "To quit, type: :cljs/quit\n", <<- It is OK
:session "3f732512-7af4-4f56-b43f-054b1eb246b4"}
{:id "cd73345e-7078-4249-ae37-1fe2cba61be0",
:ns "cljs.user",
:session "3f732512-7af4-4f56-b43f-054b1eb246b4",
:value "nil"}
{:id "cd73345e-7078-4249-ae37-1fe2cba61be0",
:session "3f732512-7af4-4f56-b43f-054b1eb246b4",
:status ["done"]})
nil
Evaluate ClojureScript
user=> (msg "(clj->js {})")
({:id "561211b9-ae5f-4674-86ce-f2e1a7141bc0",
:ns "cljs.user",
:session "3f732512-7af4-4f56-b43f-054b1eb246b4",
:value "#js {}"} <<- It works now
{:id "561211b9-ae5f-4674-86ce-f2e1a7141bc0",
:session "3f732512-7af4-4f56-b43f-054b1eb246b4",
:status ["done"]})
nil
Indeed the session ID remains the same 3f732512-7af4-4f56-b43f-054b1eb246b4
Let's close this as it seems answered.
Hello I am trying to start ClojureScript nREPL with CLI Tools When I try to send ClojureScript expression to ClojureScropt nREPL it is treaded as Clojure
deps.edn
Start nREPL
Define a function to send message to nREPL
Try to switch to ClojureScript nREPL
Check if ClojureScript nREPL works