2017-08-11 1 views
1

J'utilise actuellement les éléments suivants qui fonctionne - mais il semble y at-il construit un peu cludgeComment obtenir l'espace de noms d'une var dans Clojure?

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

ignorant la scission de chaîne laid (rapide et sale) pour le faire?

+2

Essayez '(-> méta-var qualifiés: ns)' – ez121sl

+0

voulez-vous écrire cela comme un aswer: D ou devrais-je simplement supprimer la question? – beoliver

+0

Semble utile q & a, soit obtenir @ ez121sl pour répondre et accepter ou répondre vous-même et accepter – Josh

Répondre

2

La métadonnée var contient une référence à son espace de noms sous la clé :ns. Ce serait l'espace de noms dans lequel la var est définie. Les métadonnées de la variable var sont accessibles à l'aide de la fonction meta. Mettre tous ensemble, nous obtenons (-> some-var meta :ns) et nous pouvons expérimenter un peu:

(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"] 

Un exemple complet peut ressembler à ceci:

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