为什么';创建新名称空间后,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)