为什么让我奎因没有发挥好与EVAL?

问题描述 投票:2回答:1

我试图写一个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)))

对于第二个例子印刷的代码,并编写的代码之间的唯一区别是空白和大小写,我可以很容易地修复。我还在,但不明白为什么我第一次尝试是行不通的。在我看来,唯一的区别是变量的作用域,但它确实喜欢它似乎不应该的问题,因为我包含它的范围内评估程序。

lisp common-lisp eval quine
1个回答
7
投票
(let ((program '`(let ((program ',program )
                   (print (eval program)))))
  (print (eval program))))

在Common Lisp的标准说,大约eval

在评估当前的动态环境和空词法环境形式。

由于program是一个词法变量,它是不可见的eval

© www.soinside.com 2019 - 2024. All rights reserved.