如何在Clojure中获得var的命名空间?

问题描述:

我目前使用的工作以下 - 但似乎有点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

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))