Я пытаюсь выучить Лисп, но я застрял в этом примере (вы можете найти его в "ANSI Common Lisp", Пол Грэм, стр. 170):
(defmacro in (obj &rest choices)
(let ((insym (gensym)))
`(let ((,insym ,obj))
(or ,@(mapcar #'(lambda (c) `(eql ,insym ,c))
choices)))))
Грэм тогда заявляет:
Второй макрос [...] in
возвращает 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
эквивалентно in
.