为什么';创建新名称空间后,Clojure是否提供标准库?
我在创建新名称空间后遇到了这个问题 代码如下:为什么';创建新名称空间后,Clojure是否提供标准库?,clojure,functional-programming,namespaces,lisp,clojurescript,Clojure,Functional Programming,Namespaces,Lisp,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.RuntimeExcept
(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
函数未在mynewns
命名空间中定义
我应该能够创建新的名称空间,那么解决这个问题的最佳方案是什么
另外,我正在尝试为我的用户创建这些名称空间,以便他们能够在名称空间中做任何他们想做的事情(这个想法就像一个容器),并在名称空间之间创建隔离。您的新名称空间需要使用“标准”名称空间来解析名称。文档表明这将是
java.lang
,clojure.lang.Compiler
和clojure.core
,而不是手动创建名称空间然后切换到它,我建议使用ns
宏。根据该文件:
将*ns*设置为按名称命名的命名空间(未计算),并在需要时创建它
它还将从clojure.core
到新创建的名称空间
所以,基本上是这样
> (create-ns 'my-new-ns)
> (in-ns 'my-new-ns)
> (clojure.core/refer 'clojure.core)
等于这个
> (ns my-new-ns)
更新:
回答您的问题:标准库中的符号在新创建的名称空间中不是红色的,这就是为什么您不能在没有限定符的情况下访问它们:
> (create-ns 'x)
> (in-ns 'x)
> reduce ;; throws "Unable to resolve symbol"
> clojure.core/reduce ;; works fine
您需要通过调用
(clojure.core/refere'clojure.core)手动引用这些符号
(ns my-new-ns)
相反create ns
是一种低级功能。clojure.core函数在需要引用以使其可供非限定使用时并不特殊。ns
宏执行以下几项操作:
- 创建命名空间-
创建ns
- 将当前命名空间更改为ns中的该命名空间-
- 自动将所有clojure.core变量引用到新名称空间-
引用clojure
您始终可以使用核心函数的限定形式(非限定就是少键入),因此,当您遇到这种情况时,这个简单的调用将再次正确:
(clojure.core/refer-clojure)