Я кодирую что-то вроде сервера REPL.Запрос от пользователей оценивается в такой функции:
(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: Как сделать смещения в фрагментах кода в начале строки?