Sto codificando qualcosa come REPL Server. Richiesta dagli utenti valuta in tale funzione:clojure - codice di eval in diversi namespace
(defn execute [request]
(str (try
(eval (read-string request))
(catch Exception e (.getLocalizedMessage e)))))
Ogni client in thread separato. Ma hanno lo stesso spazio dei nomi. Come posso eseguire il codice nello spazio dei nomi dinamico creato? Quindi, quando un nuovo client è connesso, voglio creare un nuovo spazio dei nomi ed eseguire lì il codice del ciclo di gestione dei client. O forse è possibile eseguire (eval ..)
in altri namespace?
Grazie.
upd.
Risolto!
eseguire la funzione:
(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))))))
Ogni cliente riceve il proprio spazio dei nomi:
(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: Come rendere gli offset in frammenti di codice su Begin della linea?
Se il problema è stato risolto con la risposta di qualcuno, contrassegnare la risposta come corretta. Se ti è venuta in mente questa risposta, scrivila come risposta nella sezione delle risposte (non come parte della domanda) e contrassegnala come corretta. Per quanto riguarda la formattazione dei blocchi di codice, è sufficiente scriverli come paragrafi separati rientrati da quattro spazi (ho modificato la tua domanda per correggere la formattazione). Benvenuto su Stackoverflow! –
La politica ufficiale è che dovresti pubblicare una risposta alla tua domanda in questa situazione. Tuttavia, ad alcune persone non piace questa pratica e le risposte negative di OP. Quindi l'azione ufficialmente corretta è rischiosa. – Mars