2017-08-11 87 views
1

我目前使用的工作以下 - 但似乎有點cludge如何在Clojure中獲得var的命名空間?

(defn get-namespace 
    [qualified-var] 
    {:pre [(var? qualified-var)]} 
    (the-ns 
    (symbol 
    (apply str (drop 2 (first (str/split (str qualified-var) #"/"))))))) 

忽略了醜陋的字符串分割(快速和骯髒)的是有一個內置做到這一點?

+2

嘗試'( - >合格-VAR元:NS)' – ez121sl

+0

你想寫這個aswer:D或者我應該刪除這個問題? – beoliver

+0

似乎有用的問答,或者得到@ ez121sl回答並接受或回答自己,並接受 – Josh

回答

2

var的元數據包含對:ns密鑰下其名稱空間的引用。那將是定義var的命名空間。 var的元數據可以使用meta函數訪問。全部放在一起,我們得到(-> some-var meta :ns),我們可以試驗一下:

(def x "foo") 
;; #'user/x 
(-> #'x meta :ns) 
;; #object[clojure.lang.Namespace 0x396bcdb0 "user"] 
(-> #'clojure.core/map meta :ns) 
;; #object[clojure.lang.Namespace 0x28412381 "clojure.core"] 

完整的例子可能是這樣的:

(defn var-namespace 
    [qualified-var] 
    {:pre [(var? qualified-var)]} 
    (-> qualified-var meta :ns)) 
相關問題