在不存在的命名空间中,命名空间clojure关键字是否有任何问题?

Rob*_*lan 9 namespaces clojure keyword

我是否应该对创建具有不存在的命名空间的clojure关键字感到谨慎?

一个例子是:foo/bar,其中命名空间foo实际上并不存在.这似乎是可能的,因为这些关键字的行为类似于文字.我在REPL中找不到任何问题,但是我担心AOT编译可能出现的问题.

Mic*_*zyk 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
Run Code Online (Sandbox Code Playgroud)

但是,这不用担心.关键字或符号的"命名空间"字段只是一个实习字符串; 即使存在一个,也没有对相关的命名空间对象的引用.事实上,正如上面所看到的.getNamespace,关键字和符号的方法返回一个字符串,并且必须跳几跳以从中获取实际的命名空间.

尝试使用该resolve函数解析名称空间限定符号也是安全的.无论命名空间是否存在,都是如此; 如果不存在,nil则返回,如同它存在的情况一样,但不保留给定名称的Var.ns-resolve相反,如果它找不到给定的命名空间,它将抛出一个异常,如上面REPL的片段中提到的异常.