SICP 全笔记

本文档来源于我在做 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 上看到作者的技术文章。