1

我对 Scheme 的评估有疑问,我只是想确保我对如何评估程序有正确的理解。

因此,当 Scheme 解释器开始评估一个列表时,第一个元素被评估,这必须评估为一个过程,否则它就是一个错误。如果此过程不是特殊形式,则对列表中的每个元素进行求值,然后将其作为参数传递给过程。如果该过程是一种特殊形式,则执行不同的评估过程,例如如果,则评估第一个参数,然后仅评估两个和三个参数中的一个。此外,原子对自身进行评估,或者对它们先前绑定的值进行评估。

基本上,是否需要特殊表格来阻止对所有内容进行评估?谢谢

4

2 回答 2

2

是的,需要特殊表格来处理您不希望对所有内容进行评估的特殊情况。if是一个很好的例子:

(if (both-keys-turned) (launch-nuclear-missiles))

如果所有参数都被评估,这将在评估步骤期间发射导弹,而不是等待if测试两个键是否都被转动。

或考虑类似define

(define var value)

如果这是评估var的,它将无法分配给它。

于 2014-03-20T02:51:15.560 回答
2

你的问题的答案是肯定的。

首先,您关于原子评估的最后一句话是不正确的,因为它表明原子的含义取决于它是否已被绑定;这是不正确的。数字、字符串、布尔值和带引号的形式是值并且对它们自己求值。标识符不是值,并且可以评估它们绑定的任何内容(或者,如果您考虑使用替换进行评估,那么当您找到它们时它们已经消失了)。

其次,您对处理列表的评估者的描述是......在一定程度上是合理的。这是构建简单解释器的合理方法,也是评估语义的合理基础,但是如果您查看任何主流 Scheme 解释器(包括 Racket)的内部,您会看到看起来像任何其他的东西语言——也就是说,句法层解析输入,然后进行编译,然后运行生成的程序。我不希望您留下一个印象,即 Scheme 解释器实际上将语法处理为列表。

很抱歉所有的吹毛求疵。也许我们应该说“是”,然后继续我们的生活。

于 2014-03-20T06:13:59.690 回答