Я читаю «Практический общий Лисп» Питера Сейбела. В Chapter 9, он ходит читателя через создание основы модульного тестирования, и он включает в себя следующий макрос, чтобы определить, является ли список, состоящий только из истинных выражений:Есть ли преимущество для этого макроса?
(defmacro combine-results (&body forms)
(let ((result (gensym)))
`(let ((,result t))
,@(loop for form in forms collect `(unless ,form (setf ,result nil)))
,result)))
Я не ясно, что преимущество использования макрос здесь, хотя - кажется, что следующий будет понятнее, а также более эффективно для динамических значений:
(defun combine-results (&rest expressions)
(let ((result t))
(loop for expression in expressions do (unless expression (setf result nil)))
result))
ли преимущество в макрос только что это более эффективно, во время выполнения любых вызовов, которые расширен во время компиляции? Или это парадигма? Или книга просто пытается оправдываться, чтобы практиковать разные шаблоны в макросах?
Реальное преимущество макроса заключается в том, что он имеет доступ к исходным формам и, следовательно, может печатать форму, которая не может быть оценена до истинного значения. Печально, что пример книги на самом деле не показывает этого. – hans23
@ hans23: в коде книги формы фактически являются макросами, которые печатают результат. –