2010-06-07 66 views
9

我應該對創建具有不存在名稱空間的clojure關鍵詞感到警惕嗎?命名空間clojure關鍵字在不存在的命名空間中是否存在任何問題?

一個例子是:foo/bar,其中名稱空間foo實際上不存在。這似乎是可能的,因爲這些關鍵字的行爲像文字。在REPL中,我找不到任何問題,但我擔心AOT編譯可能存在問題。

+1

我已經爲過去的某些事情做過這件事,並沒有任何問題。 – 2010-06-08 03:22:07

回答

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的片段中提到的異常。

相關問題