本文档来源于我在做 SICP (《Structure and Interpretation of Computer Programs》) 时的各个练习题答案的整理。同时这个文档也提供了部分章节的知识的梳理。
本文档难免有不正之处,如果有任何意见与建议,欢迎给我邮件。
编程语言与工具
本文档使用的 Scheme 语言的解释器是 MIT-Scheme。使用 Emacs 来辅助代码的编写。你可以在这里找到一些使用 Emacs 来编写 Scheme 的技巧:
测试工具
工具简介
本文档使用的自己编写的简单的测试工具,在这里可以找到。
这个测试工具针对 SICP 习题的特点提供了一些便利的功能。在 MIT-Scheme 中,使用者在代码中载入后即可使用以下 assertion:
- asserteq?
- assertequal?
- assert=
- asserttrue
- assertfalse
- assert-output-equal
- assert/exn
使用举例
asserteq?, assert=, assertequal? 分别使用 eq?, =, equal? 去断言参数的相等。
asserttrue,assertfalse 分别断言参数为 true 与断言 false。
assert-output-equal 可以断言两个参数语句的输出是相等的,例如:
(define (for-each proc lst)
(cond ((null? lst) true)
(else
(begin
(proc (car lst))
(for-each proc (cdr lst))))))
;;; tests begin
(load "../testframe.scm")
(assert-output-equal
(for-each (lambda (x) (newline) (display x))
(list 57 321 88))
"
57
321
88")
assert/exn 可以断言参数抛出的异常中一定包含某个字符串,例如:
1 ]=> (load "testframe.scm")
;Loading "testframe.scm"... done
;Value: testframe-loaded
1 ]=> (define (div a b) (if (= b 0) (error 'div "divided by zero") (/ a b)))
;Value: div
1 ]=> (assert/exn (div 10 0) "divided")
;Unspecified return value
关于作者
你可以在 https://ttyjournal.com 上看到作者的技术文章。