我在閱讀Paul Graham's ANSI Common Lisp。在關於宏章,他顯示了以下例子:是否可以將以下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',這不是一個宏,而只是一個功能!(但它總是評估兩個分支)」,你會說「是嗎?」 – Ashe