問題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が更新されました。