SICP练习1.5

Jel*_*alF 7 scheme sicp

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

(定义(p)(p))

(define(test xy)(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​​包.

小智 15

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

在你的口译员评估p.

p <Return>
==>  P : #function
Run Code Online (Sandbox Code Playgroud)

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

(p)
Run Code Online (Sandbox Code Playgroud)

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

作为p(p)评估不同的东西,你应该期待不同的行为.

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