当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么Clojure在创建新命名空间后不提供标准库?》经验,为你挑选了2个好方法。

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

这是代码:

(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) 

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

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

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



1> Alex Miller..:

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

创建命名空间 - create-ns

将当前名称空间更改为该名称空间 - in-ns

自动将所有clojure.core变量引入新命名空间 - refer-clojure

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

(clojure.core/refer-clojure)



2> OlegTheCat..:

我建议使用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).

推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有