命名空间是将简单(无限定)符号映射到 Var 和/或类的映射。Var 可以使用 def 或其任何变体在命名空间中进行内部化,在这种情况下,它们具有用于名称的简单符号以及对包含命名空间的引用,并且命名空间将该符号映射到相同的 var。命名空间还可以使用 refer 或 use 包含从符号到在其他命名空间中内部化的 var 的映射,或者使用 import 包含从符号到类对象的映射。请注意,命名空间是头等公民,它们可以被枚举等等。命名空间也是动态的,它们可以在运行时、REPL 等处创建、删除和修改。
在 Clojure 源文件顶部设置新命名空间的最佳方法是使用 ns 宏。默认情况下,这将创建一个包含 java.lang 中类名的映射以及 clojure.lang.Compiler
,以及 clojure.core
中函数的新命名空间。
在 REPL 中,最好使用 in-ns,在这种情况下,新命名空间将仅包含 java.lang 中类名的映射。为了访问来自 clojure.core
命名空间的名称,您必须执行 (clojure.core/refer 'clojure.core)。REPL 中的 user
命名空间已经完成了此操作。
创建命名空间并切换到命名空间: in-ns ns create-ns
添加到命名空间: alias def import intern refer
查找存在的命名空间: all-ns find-ns
检查命名空间: ns-name ns-aliases ns-imports ns-interns ns-map ns-publics ns-refers
从符号获取命名空间: resolve ns-resolve namespace
删除内容: ns-unalias ns-unmap remove-ns