Почему LET не играет хорошо с EVAL в моем квин? - PullRequest
0 голосов
/ 11 февраля 2019

Я пытался написать квин на Common Lisp.Я полагал, что один из самых простых вариантов был следующим:

(let ((program '`(let ((program ',program )
                   (print (eval program)))))
  (print (eval program))))

Это не работает, SBCL и CLISP оба жалуются, что PROGRAM не привязан.Однако я обнаружил, что при использовании DEFPARAMETER, в отличие от LET, работает :

(progn
  (defparameter program
                '`(progn
                    (defparameter program
                                  ',program)
                    (print (eval program))))
  (print (eval program)))

Во втором примере единственная разница между напечатанным кодом и написанным кодом - это пробел икапитализация, которую я могу легко исправить.Однако я до сих пор не понимаю, почему моя первая попытка не сработала.На мой взгляд, единственное отличие - это область видимости переменной, но на самом деле кажется, что это не должно иметь значения, так как я оцениваю программу в той области, в которой она содержится.

1 Ответ

0 голосов
/ 11 февраля 2019
(let ((program '`(let ((program ',program )
                   (print (eval program)))))
  (print (eval program))))

Стандарт Common Lisp говорит о eval:

Оценивает форму в текущей динамической среде и нулевом лексическая среда .

Поскольку program является лексической переменной, она не видна для eval.

...