代码之家  ›  专栏  ›  技术社区  ›  Rob Lachlan

在不存在的名称空间中,名称空间clojure关键字有问题吗?

  •  9
  • Rob Lachlan  · 技术社区  · 14 年前

    对于创建具有不存在名称空间的Clojure关键字,我应该谨慎吗?

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

    1 回复  |  直到 14 年前
        1
  •  7
  •   Michał Marczyk    14 年前

    实际上,命名空间 创建它仅仅是因为遇到了“属于”它的关键字或符号,正如下面在一个新的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的代码段中提到的异常类似的异常。