clojure - eval代码在不同的命名空间 [英] clojure - eval code in different namespace

查看:177
本文介绍了clojure - eval代码在不同的命名空间的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我编码的东西像REPL服务器。来自用户的请求在此类函数中进行评估:

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

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



谢谢。 b
$ b

upd。

解决!



执行功能:


$ b b

 (defn execute 
评估s表单
([request](执行请求* ns *))
-ns]
(str
(try
(binding [* ns * user-ns](eval(read-string request)))
(catch Exception e(.getLocalizedMessage e))))))



每个客户端都有自己的命名空间:

 (defn generate-ns 
为客户端连接生成ns
[](let [user-ns (符号(strclient-(Math / abs(.nextInt random)))))]
(execute(str(clojure.core / refer'clojure.core))user-ns)
user-ns))`

(defn delete-ns
在客户端断开后删除ns
[user-ns](remove-ns name user-ns))))

offtop:如何在代码片段?

解决方案

已解决:

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


I'm coding something like REPL Server. Request from users evaluates in such function:

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

Each client in separate thread. But they have the same namespace. How can I run code in dynamic created namespace ? So when new client connected, I want to create new namespace and to run client handling loop code there. Or maybe it's possible to run (eval ..) in other namespace ?

Thanks.

upd.
Solved!

Execute function:

(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))))))

Each client gets it's own namespace by:

(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: How to make offsets in code snippets on begin of line ?

解决方案

Solved:

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

这篇关于clojure - eval代码在不同的命名空间的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆