(gensym) ist immer eindeutig, '(symb #) ist nicht - warum?

8

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:

%Vor%

Das Problem ist offensichtlich, wenn Sie macroexpand verwenden:

%Vor%

Dieses Problem verschwindet, wenn ich gensym den langen Weg rufe:

%Vor%

Also, warum der Unterschied? Was vermisse ich?

    
galdre 14.04.2015, 19:17
quelle

1 Antwort

11

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:

%Vor%

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:

%Vor%     
Alex 14.04.2015, 19:48
quelle

Tags und Links