2017-11-26 3 views

Antwort

2

Wenn Ihr data var im Namensraum vor dem Makroaufruf definiert ist, können Sie einige Namespace Manipulation Funktionen verwenden, um es zu lösen ist Wert von Name:

(defmacro pair-defs [data] 
    `(do [email protected](for [[k v] @(ns-resolve *ns* data)] 
      `(def ~k ~v)))) 

user> (def data [['a 10] ['b 20]]) 
#'user/data 

user> (pair-defs data) 
#'user/b 

oder beide wörtliche Daten und Daten zu verarbeiten durch var name:

(defmacro pair-defs [data] 
    (let [dt (if (symbol? data) @(ns-resolve *ns* data) data)] 
    `(do [email protected](for [[k v] dt] 
      `(def ~k ~v))))) 

der Anruf an die gewünschte Form expandiert wird:

(do (def a 10) (def b 20))

Also das Auflösen der Namespace val ohne schmutzige Tricks wie eval ist völlig möglich, aber ich finde es eine ziemlich unnötige Verwendung von Makros. Zum Beispiel ist Ihre Aufgabe leicht durch einfachen Funktionsaufruf ersetzbar.

(defn pair-defs1 [data] 
    (doseq [[k v] data] 
    (intern *ns* k v))) 

es auf jeder data Sequenz funktionieren würde, sei es lokal oder global, wörtliche oder

erzeugt