练习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包。
答案 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
。)