我不清楚爲什麼在下面的代碼片段中,foo被定義在「user」命名空間中,而不是我綁定的那個* ns *綁定關閉。有人能解釋我錯過了什麼嗎?在將* ns *綁定到別的東西后,定義一個變量
$ clj Clojure 1.4.0 user=> (let [nspace (create-ns (gensym "sandbox"))] (binding [*ns* nspace] (print (ns-name *ns*)) (def foo 6))) sandbox3#'user/foo user=> foo 6 user=> (in-ns 'sandbox3) # sandbox3=> foo CompilerException java.lang.RuntimeException: Unable to resolve symbol: foo in this context, compiling:(NO_SOURCE_PATH:0) sandbox3=> (def bar 7) #'sandbox3/bar sandbox3=> bar 7 sandbox3/user=> (in-ns 'user) # user=> foo 6 user=> bar CompilerException java.lang.RuntimeException: Unable to resolve symbol: bar in this context, compiling:(NO_SOURCE_PATH:0)
Augh,不!如果你絕對必須在另一個命名空間中定義變量(並且你可能不需要),使用'intern'。在這裏使用'eval'沒有任何理由。 – amalloy