Разница между определением макроса и определением функции

Я пытаюсь изучить Лисп, но я застрял на этом примере (вы можете найти его на" 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 эквивалентен в .

8
задан Rainer Joswig 6 October 2013 в 06:48
поделиться