【发布时间】:2012-05-13 09:58:05
【问题描述】:
我正在阅读Paul Graham's ANSI Common Lisp。在关于宏的章节中,他展示了以下示例:
(defmacro in (obj &rest choices)
(let ((insym (gensym)))
`(let ((,insym ,obj))
(or ,@(mapcar #'(lambda (c) `(eql ,insym ,c))
choices)))))
(如果第一个参数等于任何其他参数,则返回 true)
他认为它不能写成函数。这个函数不也有同样的功能吗?
(defun in (obj &rest choices)
(reduce (lambda (x y)
(or x (eql y obj)))
choices
:initial-value nil))
我看到的不同之处在于,宏只会在找到 eql 参数之前评估参数。是这样吗?
【问题讨论】:
-
那是一个相当大的“是吗?”。如果有人说“我可以给你一个
IF,它不是宏,而只是一个函数!(但它总是评估两个分支。)”,你会说“是吗?”
标签: macros common-lisp