Dies ist ein Zitat zum Thema "Kompilierung und Makroexpansion", aus dem Buch Common Lisp: A gentle introduction to symbolic computation.Kompilierung und Makros
(defmacro bad-announce-macro()
(format t "~%Hi mom!"))
(defun say-hi()
(bad-announce-macro))
> (compile 'say-hi)
Hi, mom!
SAY-HI
> (say-hi)
NIL
Im obigen Beispiel wurde das Makro als Teil des von Kompilieren SAY-HI
Prozesses erweitert. Also der Compiler sagte ‘‘Hi, mom!’’
Das Ergebnis der Makro war NIL
, so dass was in den Körper von SAY-HI
kompiliert wurde. Wenn wir die kompilierte SAY-HI
Funktion aufrufen, sagt das nichts, weil das Makro durch seine Erweiterung ersetzt wurde.
In diesem Zitat sagt der Autor, dass
das Makro mit der Expansion
Gute
ersetzt wurde, so sollte es nicht atleast zeigt die gedruckte"Hi mom!"
? Denn obwohl das Makro nichts zurückgibt, wird es trotzdem durch etwas ersetzt (es ist Expansion). Basierend auf dem Code stellte ich die Hypothese auf, dass
, wenn eine Funktion aufgerufen wird, nachdem es kompiliert wurde, alle Makros, die in seinem Körper aufgerufen werden, in das Ergebnis, das sie zurückgeben, nicht in was auch immer sie in ihren eigenen Körpern haben .
Ich bin mir nicht sicher, ob das richtig ist. Und der Grund dafür ist auch nicht klar.
Die Erweiterung eines Makros ist der Rückgabewert des Makros. Da das Makro "NIL" zurückgibt, ist seine Erweiterung "NIL", und das ist, wodurch es in der "SAY-HI" -Funktion ersetzt wird. – jkiiski
@jkiiski: Aber warum druckt die Funktion '' Hallo Mama! '' Bis sie nicht kompiliert wird? – Mooncrater
Das Makro wird erweitert, wenn der Code kompiliert wird (die Nebenwirkungen des Makros treten während der Erweiterung auf). Bis dahin wird der Code interpretiert (und das Makro wird im laufenden Betrieb erweitert, wenn die Funktion aufgerufen wird), unabhängig davon, welche Implementierung Sie verwenden. – jkiiski