9
我應該對創建具有不存在名稱空間的clojure關鍵詞感到警惕嗎?命名空間clojure關鍵字在不存在的命名空間中是否存在任何問題?
一個例子是:foo/bar,其中名稱空間foo實際上不存在。這似乎是可能的,因爲這些關鍵字的行爲像文字。在REPL中,我找不到任何問題,但我擔心AOT編譯可能存在問題。
我應該對創建具有不存在名稱空間的clojure關鍵詞感到警惕嗎?命名空間clojure關鍵字在不存在的命名空間中是否存在任何問題?
一個例子是:foo/bar,其中名稱空間foo實際上不存在。這似乎是可能的,因爲這些關鍵字的行爲像文字。在REPL中,我找不到任何問題,但我擔心AOT編譯可能存在問題。
命名空間實際上將不僅僅因爲一個關鍵字或符號遇到這將「屬於」它,因爲在新的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的片段中提到的異常。
我已經爲過去的某些事情做過這件事,並沒有任何問題。 – 2010-06-08 03:22:07