首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SICP练习1.5

SICP练习1.5
EN

Stack Overflow用户
提问于 2012-07-04 19:37:18
回答 1查看 2.3K关注 0票数 7

练习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包裹。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-04 19:57:19

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

在解释器中评估p

代码语言:javascript
复制
p <Return>
==>  P : #function

现在评估(p)。确保你知道怎么杀死你的翻译!(可能有一个“停止”按钮在博士的球拍。)

代码语言:javascript
复制
(p)

注意什么都不会发生。或者,至少,什么都看不见。解释器正在旋转,消除了尾调用(所以,使用了接近0的内存),调用p

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

至于您的第二个问题:您将p定义为返回自身的函数。同样,尝试用您的p(p)来评估(define (p) p),看看您得到了什么。我的猜测(我使用的计算机,我不能安装任何东西,而且没有任何方案)是,他们将评估相同的事情。(我甚至可以打赌,(eq? p (p))将评估为#t。)

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11334611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档