使用in-ns移动到新命名空间时,为什么会丢失所有符号?

Lin*_*son 1 namespaces clojure leiningen read-eval-print-loop

在Leiningen REPL中运行以下代码:

(in-ns 'my-namespace.core)
(+ 2 2)
Run Code Online (Sandbox Code Playgroud)

导致此错误:

CompilerException java.lang.RuntimeException: Unable to resolve symbol: + in this context
Run Code Online (Sandbox Code Playgroud)

为什么?

Lin*_*son 5

使用时创建新的命名空间时in-ns,clojure.core默认情况下不会引用核心命名空间()."引用"命名空间意味着将它包含在您的命名空间中,以便您可以将该命名空间的符号称为您自己的符号.

仍然可以使用符号来clojure.core使用完全限定名称,如下所示:

(clojure.core/+ 2 2)
Run Code Online (Sandbox Code Playgroud)

解决方案是:

  1. 使用ns而不是in-ns像这样:(ns my-namespace.core)
  2. 请参考clojure.core,如下:(clojure.core/refer-clojure)