诡秘深奥的现代魔法 1.1

改名叫《诡秘深奥的现代魔法》,“诡秘深奥”是书中第一章形容程序设计语言的词语。

注意!翻译过程中有一些错误,可以看之前先根据勘误表改正,注意勘误表中有一条关于微分方程的勘误(dy/dt 被勘误表改成 dy/dy)可能是错的(原文的方程可能是对的),修改的时候注意。(update: 我发邮件过去确认了我的猜测是对的,之后可能会被更正。)

这一小结说的内容比较基本,讲述了程序设计和Lisp 里面的一些基本原理。

正则序和应用序

我是这样理解正则序和应用序的,正则序是先展开后求值,应用序是先求值再展开。正则序更常用的术语是惰性求值,我比较熟悉的Python 中的生成器就是惰性求值的例子,其他语言也有类似的,似乎都是受Lisp 的启发。(参见第一条评论,是我搞错了)

习题

1.1

1.2

1.3

Update: 这里我看错习题了,本来这个习题也翻译错了(参见勘误表),所以先空着。

1.5

因为 (p) 无限递归调用自己,所以一旦对(p) 求值就会无限递归,但是电脑没有空间让程序无限下去,所以会塞满栈,程序爆栈而亡。

不过Scheme 有尾递归优化,能释放不需要的栈,所以很可能你看到的情况是一直计算没有结果,也就是无线循环。

可以说(p) 就是埋设的一个炸弹。 因为应用序是一开始就求值,所以用应用序的话毫无疑问就会StackOverFlow(爆栈)。

而正则序,因为在第一条件为真后才处理,立即返回,所以不会对(p) 求值。

1.6

这一题因为说明很少所以比较难,但实际上和上一题一样也是关于正则序和应用序的问题。

实际测试就会发现会陷入死循环或者爆栈,但是cond 语句本身并不会这样,所以问题是出在define 上的。 也就是说解释器将实参(实际参数)代入形参(形式参数)的时候会按应用序对参数求值。

1.7

这里我只贴出 good-enough? 部分,完整代码在这里

1.8

因为很简单所以没什么好说的,点这里看完整代码

诡秘深奥的现代魔法 1.1》上有3条评论

  1. Pingback引用通告: 诡秘深奥的现代魔法 – SICP 读书笔记 0 | 蛋炒饭

发表评论

电子邮件地址不会被公开。 必填项已用*标注