我正在阅读 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))
宏的优势仅仅是它在运行时对于在编译时扩展的任何调用更有效吗?还是它是一种范式?还是这本书只是试图为在宏中练习不同模式提供借口?