练习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.)