Ich lese Practical Common Lisp von Peter Seibel. In Chapter 9 wird er den Leser durch die Schaffung einer Einheit Test-Framework zu Fuß, und er enthält das folgende Makro, um zu bestimmen, ob eine Liste der einzig wahre Ausdrücke zusammen:Gibt es einen Vorteil für dieses Makro?
(defmacro combine-results (&body forms)
(let ((result (gensym)))
`(let ((,result t))
,@(loop for form in forms collect `(unless ,form (setf ,result nil)))
,result)))
Ich bin nicht klar, was den Vorteil der Verwendung von obwohl ein Makro ist hier - es scheint, wie die folgende wäre klarer, sowie effiziente für dynamische Werte:
(defun combine-results (&rest expressions)
(let ((result t))
(loop for expression in expressions do (unless expression (setf result nil)))
result))
ist der Vorteil für den Makro nur, dass es zur Laufzeit für alle Anrufe effizienter ist, die zur Kompilierzeit erweitert? Oder ist es ein Paradigmen-Ding? Oder versucht das Buch nur Ausreden zu geben, um verschiedene Muster in Makros zu üben?
Der eigentliche Vorteil des Makros besteht darin, dass es Zugriff auf die ursprünglichen Formulare hat und somit das Formular drucken kann, das nicht zu einem echten Wert ausgewertet werden konnte. Es ist traurig, dass das Buchbeispiel das nicht wirklich zeigt. – hans23
@ hans23: Im Buchcode sind die Formulare eigentlich Makros, die das Ergebnis ausgeben. –