Es gibt auch ein weiteres Merkmal von PROGN
, die Sie nicht mit einer Funktion erhalten können:
Stellen Sie sich vor diesen Code in einer Datei von Common Lisp Code:
(progn
(defmacro foo()))
gegen
(my-progn
(defmacro foo()))
Mit PROGN
behandelt der Compiler das Formular DEFMACRO
als Formular der obersten Ebene. Das bedeutet zum Beispiel, dass der Compiler bemerkt, dass es eine Makrodefinition gibt und sie in der Kompilierzeitumgebung verfügbar macht.
Mit einer Funktion MY-PROGN
erkennt der Compiler das Formular DEFMACRO
nicht, da es nicht auf oberster Ebene ist.
Enthält 'defun 'nicht bereits eine implizite' progn'? Überprüfen Sie die Makro-Erweiterung von 'defun'. – tuscland
Die Antworten von @ sds und @ RainerJoswig sind wichtige Punkte. Die 'values' in der Antwort von @sds sind etwas, das Sie ab und zu auffangen können, und das Verhalten, das @RainerJoswig beschreibt, ist sehr wichtig, besonders wenn Sie anfangen, makrobasierte Formulare der obersten Ebene in Ihre Quelle zu schreiben; Wenn diese mehr produzieren als die Form, die als Top-Level behandelt werden soll, dann braucht man "Prognose". –