Я пытаюсь изучить Лисп, но я застрял на этом примере (вы можете найти его в "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
.
dolist
также макрос, хотя и более сложный. - person geekosaur   schedule 04.05.2011dolist
- это макрос, но в целом есть хороший смысл избегать написания макросов new, если вы можете делать то же самое с функциями. Макросы могут усложнить код для будущих читателей, поскольку они не следуют обычным правилам оценки. (Но, конечно, в этом случаеin
определяется как макрос именно из-за этого.) - person Eli Barzilay   schedule 04.05.2011