Я пытаюсь изучить Лисп, но я застрял на этом примере (вы можете найти его на" ANSI Common Lisp ", by Paul Graham, page 170):
(defmacro in (obj &rest choices)
(let ((insym (gensym)))
`(let ((,insym ,obj))
(or ,@(mapcar #'(lambda (c) `(eql ,insym ,c))
choices)))))
Затем Грэм заявляет:
Второй макрос [...]
в
возвращаетtrue
, если его первый аргумент -eql
к любому из других аргументов. Выражение, которое мы можем записать как:
(in (car expr) '+ '- '*)
, в противном случае нам пришлось бы записать как
(let ((op (car expr)))
(or (eql op '+)
(eql op '-)
(eql op '*)))
Почему я должен писать макрос, когда следующая функция, которую я написал , кажется вести себя таким же образом?
(defun in-func (obj &rest choices)
(dolist (x choices)
(if (eql obj x)
(return t))))
Я не понимаю, если я что-то упускаю, или в данном случае in-func
эквивалентен в
.