【发布时间】:2016-05-03 22:31:55
【问题描述】:
我正在阅读 Peter Seibel 的 Practical Common Lisp。在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 : 在本书代码中,表单实际上是宏,用于打印结果。
标签: macros lisp common-lisp practical-common-lisp