SICPの問題をやっていて(3.2)どうしても納得が行かない点があります
独立したオブジェクトを作る問題で、以下のような条件を満たすmake-monitoredメソッドを作っています
scheme
1(define s (make-monitored sqrt)) 2 3(s 100) 4;10 5(s 'how-many-calls?) 6;1 7(s 'reset) 8;0 9(s 'how-many-calls?) 10;0
要は、引数に数値を入れると格納したメソッドを実行し、how-many-calls?というシンボルを入れると実行した回数(初期値0)、resetで回数をリセットするというメソッドです
最終的に回答は以下のような形らしいのですが、
scheme
1(define (make-monitored f) 2 (let ((cnt 0)) 3 (lambda (x) 4 (cond 5 ((eq? x 'how-many-calls?) cnt) 6 ((eq? x 'reset) (set! cnt 0)) 7 (else (begin (set! cnt (+ cnt 1)) 8 (f x)))))))
一方で私が考えたこちらのメソッドがうまく行かない理由がわからないのです
(define (make-monitored f) (define cnt 0) (define reset (set! cnt 0)) (define (exec m) (begin (set! cnt (+ cnt 1)) (f m))) (define (dispatch m) (cond ((eq? m 'how-many-calls?) cnt) ((eq? m 'reset) reset) (else (exec m)))) dispatch) (s 100) ;10 (s 'how-many-calls?) ;1 (s 'reset) ;0 (s 'how-many-calls?) ;リセットが反映されない ;1
なぜ後者だとresetが適用されないのでしょうか?
よろしくお願いします
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/10/01 10:19