DrSchemeでSICP

SICPのサンプルコードで、そのまま書いてもうまく動作しないものを解決する。DrScheme+Moduleという組み合わせを想定する。

trace の使い方
再帰的に定義された関数がどのように自分自身を呼び出しているのかを見るのに、trace という関数が使えるらしい。DrScheme+Module ではそのままでは使えないので、以下の一行をプログラムに追加する。

(require (lib "trace.ss"))

例えば、1.2.5 節の最大公約数の例なら

(require (lib "trace.ss"))
(define (gcd a b)
  (if (= b 0) 
      a
      (gcd b (remainder a b))))
(trace gcd)

とやっておけば、

(gcd 206 40)
|(gcd 206 40)
|(gcd 40 6)
|(gcd 6 4)
|(gcd 4 2)
|(gcd 2 0)
|2
2

となる。

runtime
問題 1.22 で、プログラムの実行時間計測のために runtime という関数が必要となる。これは

(define (runtime) (current-milliseconds))

と定義してやればよい。

nil
問題2.2.1以降で必要な nil は、空リストで定義しておく。

(define nil '())