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

标签 namespaces clojure eval

我正在编写类似于 REPL 服务器的代码。来自用户的请求在这样的函数中进行评估:

(defn execute [request]
  (str (try
          (eval (read-string request))
        (catch Exception e (.getLocalizedMessage e)))))

每个客户端在单独的线程中。但它们具有相同的命名空间。如何在动态创建的命名空间中运行代码?因此,当新客户端连接时,我想创建新的命名空间并在那里运行客户端处理循环代码。或者也许可以运行 (eval ..)在其他命名空间中?

谢谢。

更新。
解决了!

执行功能:
(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))))))

每个客户端通过以下方式获得自己的命名空间:
(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))))

offtop:如何在行首的代码片段中制作偏移量?

最佳答案

解决了:

(binding [*ns* user-ns] (eval (read-string request)))

关于namespaces - clojure - 不同命名空间中的 eval 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7684656/

相关文章:

python - django 身份验证 URL 的默认命名空间是什么?

python - 这可能涉及 namespace ,但我无法弄清楚为什么在一个示例中找不到该名称,但在另一个示例中找到了

clojure - 从 Clojure REPL 重新启动 HTTP 服务器的工作流程

multithreading - clojure 动态绑定(bind)、读取字符串和 eval 无法解析符号

Javascript:返回在 eval 中创建的值

c# - 如何从 Visual C# 2013 中的另一个(引用)项目访问表单组件?

Python:如何导入命名空间的一部分

macros - Clojure 宏扩展

c# - 具有元语言抽象的语言是否比仅使用反射 API 的语言表现更好?

python - 带有传统除号 (÷) 的 eval() 问题