SICP练习1.5

时间:2012-07-04 19:37:18

标签: scheme sicp

  

练习1.5。 Ben Bitdiddle发明了一项测试,以确定他所面临的口译员是否正在使用申请顺序   评估或正常评估。他定义了以下两个   程序:

     

(define(p)(p))

     

(define(test x y)(if(= x 0))         0         Y))

     

然后他评估表达式

     

(测试0(p))

     

Ben使用的翻译会观察到什么行为   申请订单评估?他会用什么行为来观察   使用正态评估的翻译?

我理解练习的答案;我的问题在于如何解释(p)与p的关系。例如,(test 0(p))导致解释器挂起(这是预期的),但是(测试0 p)上面的定义立即求值为0.为什么?

此外,假设我们将定义更改为(define(p)p)。根据给定的定义,(测试0(p))和(测试0 p)都评估为0.为什么会出现这种情况?为什么翻译不挂?我正在使用Dret博士和SICP​​包。

1 个答案:

答案 0 :(得分:15)

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

在口译员中评估p

p <Return>
==>  P : #function

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

(p)

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

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

关于你的第二个问题:你将p定义为一个返回自身的函数。再次尝试使用p评估(p)(define (p) p),看看你得到了什么。我的猜测(我使用的计算机上我无法安装任何东西,而且没有任何方案)是他们会评估相同的东西。 (我甚至可能会认为(eq? p (p))会评估为#t。)