問題4-29

この問題では、メモ化するのとしないのとで、振る舞いがどう変わるかを調べます。下記のような定義が存在していて、

(define count 0)
(define (id x) (set! count (+ count 1)) x)
(define (square x) (* x x))

メモ化をしない場合は、

(square (id 10))  ;=>100
count  ;=>2

となり、メモ化した場合は、

(square (id 10))  ;=>100
count  ;=>1

となります。これは、squareに仮パラメータxに(id 10)が引き当てられて、それが評価される過程において、idの本体処理を呼び出すわけですが、メモ化した場合は、一度idに10を渡して呼び出すと、set!を経た上で10が返され、この戻り値がメモされます。そのため、二度目にidを呼び出した時は、set!を経ずに、ただメモされている10が返ります。メモ化しなかった場合は、いちいちset!ロジックを通るため、countも二回更新されてしまいます。
問題4-28に取り組んだ時に、wを二回作用させるとどうなるかということを試しました。wが(id 10)に束縛されているので、countがどんどん更新されていましたが、これはメモ化してないバージョンだったからで、メモ化した場合は、二回目以降にwを作用させても、countは更新されませんでした。ただ、(id (id 10))と(id 10)は別物なので、一回目のw作用時には、countが更新されました。