make-monitoredの仕様:
- 1引数の関数fを引数として取る
- 返り値はfが何回呼び出されたかを保持する関数mf
- mfは"how-many-calls?"を引数として渡された場合,fが呼び出された回数を返す
- mfは"reset-count"を引数として渡された場合,fが呼び出された回数を0に戻す
- 上記以外の引数が渡された場合,fにその引数を渡して返ってきた結果を返す
こんな感じ.fのラッパを作るみたいな印象です.
(define (make-monitored f) (let ((count 0)) (define (dispatch input) (cond ((eq? input 'how-many-calls?) count) ((eq? input 'reset-count) (set! count 0)) (else (begin (set! count (+ count 1)) (f input))))) dispatch))
(define mf (make-monitored square)) (mf 5) ; 25 (mf 10) ; 100 (mf 'how-many-calls?) ; 2 (mf 'reset-count) ; 0 (mf 3) ; 9 (mf 'how-many-calls?) ; 1