Wie implementiere ich ein Lisp-Makrosystem?

Ich habe mein eigenes Lisp auf node.js implementiert. Ich kann S-Ausdrücke wie folgt ausführen:

(assert (= 3 (+ 1 2)))

(def even? (fn [n] (= 0 (bit-and n 1))))

(assert (even? 4))
(assert (= false (even? 5)))

Nun möchte ich Makros hinzufügen - dasdefmacro Funktion - aber hier stecke ich fest. Ich frage mich, wie Makrosysteme in anderen Lisps implementiert sind, aber ich konnte nicht viele Hinweise finden (außerDie undDie).

Ich habe mir das Clojure-Makrosystem angeschaut - das Lisp, mit dem ich am besten vertraut bin -, aber das schien zu kompliziert und ich konnte keine zusätzlichen Hinweise finden, die ich leicht anwenden kann (Clojure-Makros kompilieren letztendlich zu Byte-Code, der dies nicht tut trifft auf Javascript zu, auch ich konnte das @ nicht verstehmacroexpand1 Funktion.)

Also meine Frage ist: Bei einer Lisp-Implementierung ohne Makros, aber mit einem AST, wie fügt man ein Makrosystem wie das Makrosystem von Clojure hinzu? Kann dieses Makrosystem in Lisp implementiert werden oder erfordert es zusätzliche Funktionen bei der Implementierung in der Hostsprache?

Eine zusätzliche Bemerkung: Ich habe @ nicht implementiequote (') noch, weil ich nicht herausfinden konnte, welche Werte in der zurückgegebenen Liste enthalten sein sollten. Sollte es AST Elemente oder Objekte wie @ enthaltSymbol undKeyword (Letzteres gilt für Clojure)?

Antworten auf die Frage(8)

Ihre Antwort auf die Frage