我編碼的東西像REPL服務器。來自用戶的請求評估中這樣的功能:clojure - 在不同命名空間的eval代碼
(defn execute [request]
(str (try
(eval (read-string request))
(catch Exception e (.getLocalizedMessage e)))))
在單獨的線程中的每個客戶端。但他們有相同的命名空間。我如何在動態創建的命名空間中運行代碼?所以當新的客戶端連接時,我想創建新的命名空間並在那裏運行客戶端處理循環代碼。或者也許可以在其他命名空間運行(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))))))
每個客戶端獲得它通過自己的命名空間:
(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:如何使偏移的代碼片斷開始上線的?
如果您的問題已被某人的答案解決,請將該答案標記爲正確。如果您自己想出了這個答案,請在答案部分(不是問題的一部分)將答案寫下來,並將其標記爲正確。關於代碼塊的格式,只需將它們作爲單獨的段落縮進四個空格(我編輯了您的問題以修復格式)。歡迎來到Stackoverflow! –
官方政策是你應該在這種情況下發布你的問題的答案。但是,有些人不喜歡這種做法,並且OP會減少答案。因此,正式的正確行動是有風險的。 – Mars