练习1.5.本·比迪德尔发明了一种测试,以确定他所面对的解释器是使用应用级评估还是正常顺序评估。他定义了以下两个程序: (定义(p) (p)) (定义(test X) (if (= x0)0y)) 然后,他评估表达式 (测试0 (p)) 使用应用程序顺序评估的解释器会观察到什么行为?对于使用正常顺序评估的解释器,他会观察到什么行为?
我理解这个练习的答案;我的问题在于( p )是如何对p进行解释的,例如(test 0 ( p) )导致解释器挂起(这是预期的),但是(测试0p)使用上述定义立即计算为0。为什么?
此外,假设我们将定义更改为(定义(p) p)。对于给定的定义,(测试0 ( p) )和(测试0p)都计算为0。为什么会发生这种情况?为什么翻译不挂?我用的是医生的SICP包裹。
发布于 2012-07-04 19:57:19
p是一个函数。(p)是对函数的调用。
在解释器中评估p。
p <Return>
==> P : #function现在评估(p)。确保你知道怎么杀死你的翻译!(可能有一个“停止”按钮在博士的球拍。)
(p)注意什么都不会发生。或者,至少,什么都看不见。解释器正在旋转,消除了尾调用(所以,使用了接近0的内存),调用p。
当p和(p)对不同的事物进行评估时,您应该期待不同的行为。
至于您的第二个问题:您将p定义为返回自身的函数。同样,尝试用您的p和(p)来评估(define (p) p),看看您得到了什么。我的猜测(我使用的计算机,我不能安装任何东西,而且没有任何方案)是,他们将评估相同的事情。(我甚至可以打赌,(eq? p (p))将评估为#t。)
https://stackoverflow.com/questions/11334611
复制相似问题