Tôi đang mã hóa một cái gì đó như REPL Server. Yêu cầu từ người dùng đánh giá ở chức năng như vậy:clojure - mã eval trong không gian tên khác nhau
(defn execute [request]
(str (try
(eval (read-string request))
(catch Exception e (.getLocalizedMessage e)))))
Mỗi khách hàng trong chuỗi riêng biệt. Nhưng chúng có cùng một không gian tên. Làm thế nào tôi có thể chạy mã trong không gian tên được tạo động? Vì vậy, khi khách hàng mới được kết nối, tôi muốn tạo không gian tên mới và chạy mã vòng lặp xử lý khách hàng tại đó. Hoặc có thể chạy (eval ..)
trong không gian tên khác?
Cảm ơn.
cập nhật.
Giải quyết!
Execute chức năng:
(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))))))
Mỗi khách hàng được nó là không gian tên riêng theo:
(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: Làm thế nào để làm cho offsets trong đoạn mã trên bắt đầu của dòng?
Nếu vấn đề của bạn được giải quyết bởi câu trả lời của ai đó, vui lòng đánh dấu câu trả lời là chính xác. Nếu bạn tự mình đưa ra câu trả lời này, vui lòng viết câu trả lời trong phần câu trả lời (không phải là một phần của câu hỏi) và đánh dấu câu trả lời đúng. Về định dạng các khối mã, chỉ cần viết chúng như các đoạn riêng biệt thụt vào bởi bốn dấu cách (tôi đã chỉnh sửa câu hỏi của bạn để sửa định dạng). Chào mừng bạn đến với Stackoverflow! –
Chính sách chính thức là bạn nên đăng câu trả lời cho câu hỏi của mình trong tình huống này. Tuy nhiên, một số người không thích thực hành đó, và câu trả lời downvote bởi OP. Vì vậy, hành động chính xác chính xác là nguy hiểm. – Mars