我试图写一个Common Lisp的奎因。我想最简单的一个选项如下:
(let ((program '`(let ((program ',program )
(print (eval program)))))
(print (eval program))))
这不起作用,SBCL和CLISP都抱怨该程序被绑定。我没有,但是,发现使用DEFPARAMETER,不像出租,做的工作:
(progn
(defparameter program
'`(progn
(defparameter program
',program)
(print (eval program))))
(print (eval program)))
对于第二个例子印刷的代码,并编写的代码之间的唯一区别是空白和大小写,我可以很容易地修复。我还在,但不明白为什么我第一次尝试是行不通的。在我看来,唯一的区别是变量的作用域,但它确实喜欢它似乎不应该的问题,因为我包含它的范围内评估程序。
(let ((program '`(let ((program ',program )
(print (eval program)))))
(print (eval program))))
在Common Lisp的标准说,大约eval
:
在评估当前的动态环境和空词法环境形式。
由于program
是一个词法变量,它是不可见的eval
。