SICP 准备

买了很久的 SICP (英文: Structure and Interpretation of Computer Programs, 中文译作: 计算机程序的构造和解释)一直在吃灰, 趁着假期捡起来.

一种 Scheme 实现

刷 SICP 不局限于特定的 Scheme 实现, 虽然 MIT-Scheme 是 MIT 出的. 然而 MIT 自己都废掉了它而指定 DrScheme 为默认课程支持版本. 本文基于的 Scheme 实现是 Chicken.

macOS 下安装很简单:

$ brew install chicken

一个编辑器

对于Scheme来说, 恐怕支持最好的就是 Emacs 了. 同样本文基于 Emacs 的定制配置版本 Spacemacs.

Spacemacs 本身就有一个 Scheme 的 Layer 可供使用, 我使用了一个基于它, 自己定制的 Layer(x-scheme).

x-scheme 依赖于 Geiser 提供 REPL 等各种便利的功能, 它使用了 Chicken 的某些扩展, 可以通过以下命令安装:

$ chicken-install chicken-doc apropos sicp # 包含 sicp 支持
$ cd `csi -p '(chicken-home)'`
$ curl http://3e8.org/pub/chicken-doc/chicken-doc-repo.tgz | tar zx

一个例子

Chicken 通过 sicp 扩展对 SICP 提供某些便利的支持, 比如一些 SICP 默认已经有了的过程(average 等). 例如 SICP 练习第一章1.7:

(use sicp) ;; sicp 扩展

(define (sqrt x)
(define (improve guess x)
(average guess (/ x guess)))
(define (good-enough? guess last-guess)
(< (/ (abs (- guess last-guess)) guess) 0.001))
(define (sqrt-iter guess last-guess x)
(if (good-enough? guess last-guess)
last-guess
(sqrt-iter last-guess (improve last-guess x)
x)))
(sqrt-iter 1.0 x x))

SICP 实用性

我们做一件事情的时候有时很喜欢考虑这个东西实用不实用, 做了有什么收益. 这没什么问题, 特别是别人问你刷 SICP 有什么用的时候, 很难回答. 因为你工作或生活中确实没有用它的场景, 甚至是产品. SICP 中文版序前有段话挺好的, 在这里分享一下:

我认为, 在计算机科学中保持计算中的趣味性是特别重要的事情. 这一学科在起步时饱含着趣味性. 当然, 那些付钱的客户们时常觉得受了骗. 一段时间之后, 我们开始严肃地看待他们的抱怨. 我们开始感觉到, 自己真的像是要负起成功地、无差错地、完美地使用这些机器的责任. 我不认为我们可以做到这些. 我认为我们的责任是去拓展这一领域, 将其发展到新的方向, 并在自己的家里保持趣味性. 我希望计算机科学的领域绝不要丧失其趣味意识. 最重要的是, 我希望我们不要变成传道士, 不要认为你是兜售圣经的人, 世界上这种人已经太多了. 你所知道的有关计算的东西, 其他人也都能学到. 绝不要认为似乎成功计算的钥匙就掌握在你的手里. 你所掌握的, 也是我认为并希望的, 也就是智慧: 那种看到这一机器比你第一次站在它面前时能做得更多的能力, 这样你才能将它向前推进. Alan J. Perlis