为什么Clojure在创建新命名空间后不提供标准库?

Ert*_*tin 4 lisp functional-programming namespaces clojure clojurescript

创建新的命名空间后,我遇到了这个问题.

这是代码:

(create-ns 'my-new-ns)
=> #object[clojure.lang.Namespace 0x7c7c8359 "my-new-ns"]

(in-ns 'my-new-ns)
=> #object[clojure.lang.Namespace 0x7c7c8359 "my-new-ns"]

(reduce + [1 2 3])
CompilerException java.lang.RuntimeException: Unable to resolve symbol: reduce in this context, compiling:(/private/var/folders/pg/bynypsm12nx1s4gzm56mwtcr0000gn/T/form-init1425759900088902804.clj:1:1) 
Run Code Online (Sandbox Code Playgroud)

如您所见,reducemy-new-ns命名空间中未定义函数.

我应该能够创建新的命名空间,那么这个问题的最佳解决方案是什么?

PS:此外,我正在尝试为我的用户创建这些命名空间,以便他们能够在他们的命名空间中做任何他们想做的事情(这个想法就像一个容器)并在名称空间之间创建隔离.

Ale*_*ler 6

clojure.core函数并不特殊,因为它们需要被引用以使它们可用于不合格的使用.该ns宏做几件事情:

  • 创建命名空间 - create-ns
  • 将当前名称空间更改为该名称空间 - in-ns
  • 自动将所有clojure.core变量引入新命名空间 - refer-clojure

你总是可以使用核心功能的合格形式(不合格只是少打字),所以当你遇到这种情况时,这个简单的通话会让你再次正确:

(clojure.core/refer-clojure)
Run Code Online (Sandbox Code Playgroud)


Ole*_*Cat 5

我建议使用ns宏,而不是手动创建命名空间然后切换到它.根据文件:

将*ns*设置为由name(未评估)命名的命名空间,并在需要时创建它.

此外,它会加载所有公共瓦尔clojure.core到新创建的命名空间.

所以,基本上这个

> (create-ns 'my-new-ns)
> (in-ns 'my-new-ns)
> (clojure.core/refer 'clojure.core)
Run Code Online (Sandbox Code Playgroud)

等于这个

> (ns my-new-ns)
Run Code Online (Sandbox Code Playgroud)

更新:

回答你的问题:标准库中的符号refer在新创建的命名空间中不是红色的,这就是为什么没有限定符就无法访问它们的原因:

> (create-ns 'x)
> (in-ns 'x)
> reduce ;; throws "Unable to resolve symbol"
> clojure.core/reduce ;; works fine
Run Code Online (Sandbox Code Playgroud)

您需要通过调用手动引用这些符号(clojure.core/refer 'clojure.core).