Я пытался написать квин на 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)))
Во втором примере единственная разница между напечатанным кодом и написанным кодом - это пробел икапитализация, которую я могу легко исправить.Однако я до сих пор не понимаю, почему моя первая попытка не сработала.На мой взгляд, единственное отличие - это область видимости переменной, но на самом деле кажется, что это не должно иметь значения, так как я оцениваю программу в той области, в которой она содержится.