#lang racket
(define (make-monitored f)
(let ((times 0))
(define (func m)
(begin (set! times (+ times 1))
(f m)))
(define (dispatch m)
(cond ((eq? m 'how-many-calls?) times)
((eq? m 'reset-count) (set! times 0))
(else (func m))))
dispatch))
(define s (make-monitored sqrt))
(s 100)
(s 100)
(s 100)
(s 'how-many-calls?)
(s 'reset-count)
(s 'how-many-calls?)
运行结果
10
10
10
3
0