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 引数が見つかるまで引数のみを評価するということです。あれですか?