我正在阅读Peter Seibel的《Practical Common Lisp》。在第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))
宏的优势只是在于编译时展开调用时更加高效吗?还是有范式上的优势?或者这本书只是试图为练习宏中的不同模式提供借口?