Wenn ich ein Makro schreibe, das die symb#
Verknüpfung verwendet, um ein Gensym zu erstellen, das dann als globale Variable gebunden wird, wird das exakt gleiche Symbol immer wieder generiert. Es funktioniert jedoch richtig, wenn ich gensym
manuell aufrufen. Sehr einfache Beispiele:(Gensym) ist immer eindeutig, `(symb #) ist nicht - warum?
(defmacro indirection
[name & body]
`(do (def name# [email protected])
(defn ~name [] name#)))
(indirection foo 3)
(foo) ; ⇒ 3
(indirection goo 5)
(goo) ; ⇒ 5
(foo) ; ⇒ 5
Das Problem ist offensichtlich, wenn Sie verwenden macroexpand
:
(macroexpand '(indirection foo 3))
(do (def name__2863__auto__ 3) (clojure.core/defn foo [] name__2863__auto__))
(macroexpand '(indirection foo 3))
(do (def name__2863__auto__ 3) (clojure.core/defn foo [] name__2863__auto__))
Dieses Problem geht weg, wenn ich gensym
der lange Weg rufen:
(defmacro redirection
[name & body]
(let [rename (gensym)]
`(do (def ~rename [email protected])
(defn ~name [] ~rename))))
(redirection koo 3)
(koo) ; ⇒ 3
(redirection moo 5)
(moo) ; ⇒ 5
(koo) ; ⇒ 3
Also, warum die Unterschied? Was vermisse ich?
Ist 'foo #' selbst eine Art Makro, das ersetzt wird, bevor die Makrodefinition überhaupt verarbeitet wird? – galdre