实际上,命名空间
不
创建它仅仅是因为遇到了“属于”它的关键字或符号,正如下面在一个新的repl上的交互说明的那样:
; SLIME 2010-05-06
user> (-> (.getNamespace :user/foo) symbol)
user
user> (-> (.getNamespace :user/foo) symbol the-ns)
#<Namespace user>
user> (-> (.getNamespace :bar/foo) symbol the-ns)
; java.lang.Exception: No namespace: bar found
然而,这并不是让人担心的原因。关键字或符号的“namespace”字段只是一个内部字符串;即使存在,也没有对相关命名空间对象的引用。事实上,如上所述,
.getNamespace
关键字和符号的方法返回一个字符串,必须跳几个跃点才能从中获得实际的名称空间。
尝试用解析命名空间限定符号
resolve
功能也是安全的。不管名称空间是否真的存在,如果不存在,
nil
返回,与它确实存在的情况一样,但不包含给定名称的变量。
ns-resolve
相反,如果找不到给定的名称空间,则会抛出一个与上面repl的代码段中提到的异常类似的异常。