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