clojure - 不同命名空间中的eval代码

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)