7

练习 1.5。 Ben Bitdiddle 发明了一种测试来确定他所面对的解释器是使用应用顺序评估还是正常顺序评估。他定义了以下两个程序:

(定义(p)(p))

(定义(测试 xy)(如果(= x 0)0 y))

然后他评估表达式

(测试 0(p))

对于使用应用顺序评估的解释器,Ben 会观察到什么行为?对于使用正常顺序评估的解释器,他会观察到什么行为?

我理解练习的答案;我的问题在于如何解释 (p) 与 p。例如, (test 0 (p)) 导致解释器挂起(这是预期的),但是具有上述定义的 (test 0 p) 立即计算为 0。为什么?

此外,假设我们将定义更改为 (define (p) p)。根据给定的定义,(test 0 (p)) 和 (test 0 p) 都计算为 0。为什么会发生这种情况?为什么解释器不挂起?我正在使用带有 SICP 包的 Dr. Racket。

4

1 回答 1

16

p是一个函数。 (p)是对函数的调用。

在您的解释器中评估p.

p <Return>
==>  P : #function

现在评估(p). 确保你知道如何杀死你的翻译!(Racket 博士中可能有一个“停止”按钮。)

(p)

请注意,没有任何反应。或者,至少,什么都看不见。解释器正在旋转,消除尾调用(因此,使用接近 0 的内存),调用p.

当评估不同的事物时,您应该期待不同的行为p(p)

As to your second question : You are defining p to be a function that returns itself. Again, try evaluating p and (p) with your (define (p) p) and see what you get. My guess (I am using a computer on which I cannot install anything and which has no scheme) is that they will evaluate to the same thing. (I might even bet that (eq? p (p)) will evaluate to #t.)

于 2012-07-04T19:57:19.283 回答