我正在阅读Paul Graham 的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 参数。是这样吗?