我在创建新命名空间后遇到了这个问题。
以下是代码:
(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:此外,我正在尝试为我的用户创建这些命名空间,以便他们能够在他们的命名空间中做任何他们想做的事情(这个想法就像一个容器)并在命名空间之间创建隔离。答案 0 :(得分:6)
clojure.core函数并不特别需要引用它们以使它们可用于不合格的使用。 ns
宏做了几件事:
create-ns
in-ns
refer-clojure
你总是可以使用核心功能的限定形式(不合格只是少输入),所以当你遇到这种情况时,这个简单的通话会让你再次正确:
(clojure.core/refer-clojure)
答案 1 :(得分:5)
我建议使用ns
宏,而不是手动创建命名空间然后切换到它。根据文件:
将* ns *设置为由name(未评估)命名的命名空间,并在需要时创建它。
它也会load all public vars从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)
手动引用这些符号。
答案 2 :(得分:1)
您的新命名空间需要使用“标准”命名空间才能解析其中的名称。文档表明这将是clojure.lang.Compiler
,clojure.core
和market/
manage.py
address/
__init__.py
models.py
management/
__init__.py
commands/
__init__.py
market_populate_countries.py
views.py
。
答案 3 :(得分:1)
我猜你应该使用
(ns my-new-ns)
代替。 create-ns
是一个低级设施。