一旦在语言中引入了赋值,代换模型就不再适合作为过程应用的模型了,新的模型是环境模型。
练习3.2:
(define (make-monitored func)
(let ((count 5))
(define (call n) (begin (set! count (+ 1 count)) (func n)))
;;(define (reset!) (set! count 0)) ;子过程
;;(define how-many count)
(define (dispatch m)
(cond ((eq? m 'how-many-calls) count) ;不要写成子过程
((eq? m 'reset-count) (set! count 0))
(else (call m))))
dispatch))
教训:根据我的经验,在消息传递的编程方式中(dispatch),如果一个子过程没有参数,就不要把它写成一个子过程,直接在对应处写上代码,就ok。