Sto leggendo Practical Common Lisp di Peter Seibel. Nel Chapter 9, sta camminando il lettore attraverso la creazione di un quadro unit testing, ed egli comprende la seguente macro per determinare se una lista è composta da solo vere e proprie espressioni:C'è un vantaggio per questa macro?
(defmacro combine-results (&body forms)
(let ((result (gensym)))
`(let ((,result t))
,@(loop for form in forms collect `(unless ,form (setf ,result nil)))
,result)))
Non sto chiaro quale sia il vantaggio di utilizzare una macro è qui, anche se - a quanto pare come la seguente sarebbe più chiaro, così come più efficiente per i valori dinamici:
(defun combine-results (&rest expressions)
(let ((result t))
(loop for expression in expressions do (unless expression (setf result nil)))
result))
è il vantaggio per la macro solo che è più efficiente in fase di esecuzione per tutte le chiamate che sono espanso in fase di compilazione? O è una cosa paradigmatica? O il libro sta solo cercando di dare scuse per praticare modelli diversi nei macro?
Il vero vantaggio della macro è che ha accesso ai moduli originali e quindi può stampare il modulo che non è riuscito a valutare un valore reale. È triste che l'esempio del libro in realtà non lo mostri. – hans23
@ hans23: nel codice libro i moduli sono in realtà delle macro, che stampano il risultato. –