После понимания (цитата) мне любопытно, как можно заставить оператор выполняться. Моя первая мысль была
(defvar x '(+ 2 21))
`(,@x)
но это просто оценивается как (+ 2 21)
или содержимое x
. Как запустить код, помещенный в список?
После понимания (цитата) мне любопытно, как можно заставить оператор выполняться. Моя первая мысль была
(defvar x '(+ 2 21))
`(,@x)
но это просто оценивается как (+ 2 21)
или содержимое x
. Как запустить код, помещенный в список?
@Кристиан Ромо:
Пример с обратной кавычкой: вы можете реализовать применение, используя eval и обратную кавычку, потому что вы можете объединять аргументы в форму. Не самая эффективная вещь в мире, но:
(eval `(and ,@(loop for x from 1 upto 4 collect `(evenp ,x))))
эквивалентно
(eval '(and (evenp 1) (evenp 2) (evenp 3) (evenp 4)))
Между прочим, это имеет тот же результат, что и (гораздо более эффективный)
(every 'evenp '(1 2 3 4))
Надеюсь, это удовлетворит ваше любопытство!
Взгляните на забавное руководство по Lisp на http://lisperati.com/. Существуют версии для Common Lisp и Emacs Lisp, демонстрирующие использование квазицитат и макросов.