SICP 読み (180) 4.1.7 構文解析を実行から分離する
昨晩の続き。以下のリストが eval-sequence に渡されてどうなるか。
((define f (lambda (i) (if ((lambda (x) (> x 100000)) i) '() (f (+ i 1))))) (f 0))
まず最初に f を手続きに束縛。define-variable! で lambda 式は eval されて以下のリストになる。ここまでは昨晩確認。
(procedure (i) ((if ((lambda (x) (> x 100000)) i) '() (f (+ i 1)))))
で、(f 0) が eval される、と。f が eval されて上の式が戻ってきた後に i を 0 で束縛したフレームを作って、procedure-body なリストを eval-sequence する。手続きの中身が eval されるのはここからになる、と。
上記のリストの ((lambda (x) (> x 100000)) i) は 100000 回 eval される事になる。同様に (f (+ i 1)) もほぼ同じ回数 (1 回少ない) eval される。ここが analyze 版との性能差を生む所以な部分になるはずなんですが、O(n) が O(n^2) になるほどの差ではないな、と。
ちょっと問題の設問が問うているナニと回答が違うような気がしますが、次に進みます。