创建新的命名空间后,我遇到了这个问题.
这是代码:
(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)
如您所见,reduce
在my-new-ns
命名空间中未定义函数.
我应该能够创建新的命名空间,那么这个问题的最佳解决方案是什么?
PS:此外,我正在尝试为我的用户创建这些命名空间,以便他们能够在他们的命名空间中做任何他们想做的事情(这个想法就像一个容器)并在名称空间之间创建隔离.
clojure.core函数并不特殊,因为它们需要被引用以使它们可用于不合格的使用.该ns
宏做几件事情:
创建命名空间 - create-ns
将当前名称空间更改为该名称空间 - in-ns
自动将所有clojure.core变量引入新命名空间 - refer-clojure
你总是可以使用核心功能的合格形式(不合格只是少打字),所以当你遇到这种情况时,这个简单的通话会让你再次正确:
(clojure.core/refer-clojure)
我建议使用ns
宏,而不是手动创建命名空间然后切换到它.根据文件:
将*ns*设置为由name(未评估)命名的命名空间,并在需要时创建它.
此外,它会加载所有公共瓦尔从clojure.core
到新创建的命名空间.
所以,基本上这个
> (create-ns 'my-new-ns) > (in-ns 'my-new-ns) > (clojure.core/refer 'clojure.core)
等于这个
> (ns my-new-ns)
更新:
回答你的问题:标准库中的符号refer
在新创建的命名空间中不是红色的,这就是为什么没有限定符就无法访问它们的原因:
> (create-ns 'x) > (in-ns 'x) > reduce ;; throws "Unable to resolve symbol" > clojure.core/reduce ;; works fine
您需要通过调用手动引用这些符号(clojure.core/refer 'clojure.core)
.