Wenn ich ein Makro schreibe, das die Verknüpfung symb#
verwendet, um ein Gensym zu erstellen, das dann als globale Variable gebunden wird, wird das exakt gleiche Symbol immer wieder erzeugt. Es funktioniert jedoch korrekt, wenn ich gensym
manuell aufruft. Sehr einfache Beispiele:
Das Problem ist offensichtlich, wenn Sie macroexpand
verwenden:
Dieses Problem verschwindet, wenn ich gensym
den langen Weg rufe:
Also, warum der Unterschied? Was vermisse ich?
Syntax-Quoting mit '
ist eigentlich ein Reader-Makro ; Die Form, die ihr folgt, wird vor der Auswertung vom Leser (der den Text in Clojure-Formen übersetzt) transformiert. Dies bedeutet, dass jedes Symbol, das in #
innerhalb der Syntax-Quotierung endet, nur einmal in ein automatisch generiertes Symbol umgesetzt wird, wenn der Text zum ersten Mal gelesen wird. Dieses automatisch generierte Symbol wird dann direkt in die Makrodefinition eingefügt und erscheint jedes Mal, wenn das Makro aufgerufen wird, wortwörtlich in der Makroexpansion. Dies kann leicht an der REPL veranschaulicht werden:
Der typische Anwendungsfall für automatisch generierte Symbole mit #
ist die Definition lokaler Variablen innerhalb einer in let
oder fn
angegebenen Form. Dort spielt es keine Rolle, dass das gleiche Symbol für mehrere Makroaufrufe wiederverwendet wird; es muss nur innerhalb jedes Aufrufs eindeutig sein. Zum Beispiel:
Tags und Links clojure