Выполнение кода, хранящегося в виде списка - PullRequest
8 голосов
/ 06 октября 2008

После понимания (цитата) мне интересно, как можно заставить оператор выполняться. Моя первая мысль была

(defvar x '(+ 2 21))
`(,@x)

, но это просто оценивается как (+ 2 21) или содержимое x. Как можно запустить код, который был помещен в список?

Ответы [ 3 ]

16 голосов
/ 06 октября 2008

(eval '(+ 2 21))

0 голосов
/ 17 ноября 2008

Взгляните на забавный учебник по Лиспу по адресу http://lisperati.com/. Существуют версии для Common Lisp и Emacs Lisp, в которых показано использование квазицитатов и макросов.

0 голосов
/ 07 октября 2008

@ Кристиан Ромо:

Пример с обратной связью: вы можете реализовать приложение, используя eval и backtick, потому что вы можете объединить аргументы в форму. Не будет самой эффективной вещью в мире, но:

(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))

Надеюсь, что удовлетворит ваше любопытство!

...