我正在阅读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)))
Run Code Online (Sandbox Code Playgroud)
我不清楚使用宏的优势在于什么 - 似乎以下内容会更清晰,并且对于动态值更有效:
(defun combine-results (&rest expressions)
(let ((result t))
(loop for expression in expressions do (unless expression (setf result nil)))
result))
Run Code Online (Sandbox Code Playgroud)
宏的优点是,它在运行时对于在编译时扩展的任何调用更有效吗?或者它是一个范例的东西?或者这本书只是试图找借口在宏中练习不同的模式?