And*_*ich 9 namespaces eval clojure
我正在编写像REPL Server这样的代码.用户的请求评估此功能:
(defn execute [request]
(str (try
(eval (read-string request))
(catch Exception e (.getLocalizedMessage e)))))
Run Code Online (Sandbox Code Playgroud)
每个客户端都在单独的线程 但它们具有相同的命名空间.如何在动态创建的命名空间中运行代码?因此,当新客户端连接时,我想创建新的命名空间并在那里运行客户端处理循环代码.或者也许可以(eval ..)在其他命名空间中运行?
谢谢.
UPD.
解决了!
执行功能:
(defn execute
"evaluates s-forms"
([request] (execute request *ns*))
([request user-ns]
(str
(try
(binding [*ns* user-ns] (eval (read-string request)))
(catch Exception e (.getLocalizedMessage e))))))
Run Code Online (Sandbox Code Playgroud)
每个客户端通过以下方式获取自己的命名空间
(defn generate-ns
"generates ns for client connection"
[] (let [user-ns (create-ns (symbol (str "client-" (Math/abs (.nextInt random)))))]
(execute (str "(clojure.core/refer 'clojure.core)") user-ns)
user-ns))`
(defn delete-ns
"deletes ns after client disconnected"
[user-ns] (remove-ns (symbol (ns-name user-ns))))
Run Code Online (Sandbox Code Playgroud)
offtop:如何在行开头的代码片段中进行偏移?
And*_*ich 15
解决了:
(binding [*ns* user-ns] (eval (read-string request)))
Run Code Online (Sandbox Code Playgroud)