理系学生日記

おまえはいつまで学生気分なのか

問題3.2 (3.1.1 Local State Variables)

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