Czytam Practical Common Lisp Peter Seibel. W Chapter 9, on idzie czytelnika poprzez stworzenie ram testów jednostkowych, a on obejmuje następujące makro w celu określenia, czy dana lista składa się tylko prawdziwych wyrażeń:Czy to makro ma zaletę?
(defmacro combine-results (&body forms)
(let ((result (gensym)))
`(let ((,result t))
,@(loop for form in forms collect `(unless ,form (setf ,result nil)))
,result)))
nie jestem jasne, co zaletą korzystania makro to tutaj, choć - wydaje się, co następuje byłby jaśniejszy, a także bardziej efektywne dla wartości dynamiczna:
(defun combine-results (&rest expressions)
(let ((result t))
(loop for expression in expressions do (unless expression (setf result nil)))
result))
Czy zaletą makra tylko, że to jest bardziej wydajny w czasie wykonywania żadnych połączeń, które są rozszerzony podczas kompilacji? Czy to jest paradygmat? A może książka stara się usprawiedliwić praktykę różnych wzorów w makrach?
Prawdziwa zaleta makra polega na tym, że ma on dostęp do oryginalnych formularzy, dzięki czemu można wydrukować formularz, którego nie udało się ocenić do prawdziwej wartości. To smutne, że przykład książki faktycznie tego nie pokazuje. – hans23
@ hans23: w kodzie książki formularze faktycznie są makrami, które drukują wynik. –