我是否应该对创建具有不存在的命名空间的clojure关键字感到谨慎?
一个例子是:foo / bar,其中名称空间foo实际上并不存在。这似乎是可能的,因为这些关键字的行为类似于文字。我在REPL中找不到任何问题,但我担心AOT编译可能出现的问题。
答案 0 :(得分:7)
实际上 创建名称空间只是因为遇到了一个“属于”它的关键字或符号,因为新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
但是,这不用担心。关键字或符号的“命名空间”字段只是一个实习字符串;即使存在一个,也没有对相关的命名空间对象的引用。事实上,正如上面所看到的,关键字和符号的.getNamespace
方法返回一个字符串,并且必须跳几跳才能从中获取实际的命名空间。
尝试使用resolve
函数解析名称空间限定符号也是安全的。无论命名空间是否存在,都是如此;如果没有,则返回nil
,如同它存在的情况一样,但不保留给定名称的Var。相反,如果找不到给定的命名空间,ns-resolve
将抛出上面REPL中的片段中提到的异常。