这一节主要是介绍局部状态变量,介绍了set!和begin的语法,看来ruby使用!号来表示改变变量值不是什么新鲜主意。 习题3.1,不解释了 ;习题3.1 (define (make-accumulator init) (define (accumulator num) (set! init (+ init num)) init) accumulator) 习题3.2,非常有趣的例子,在内部维持一个计数的变量即可,如果传入的参数是特定的符号就返回计数或者清0,如果不是,原过程调用。 ;习题3.2 (define (make-monitored proc) (let ((counter 0)) (define (proc-monitor args) (cond ((eq? args 'how-many-calls?) counter) ((eq? args 'reset-count) (begin (set! counter 0) counter)) (else (begin (set! counter (+ counter 1)) (proc args))))) proc-monitor)) 请注意,我的实现只能针对有一个参数的过程,对于多个参数的过程我还不知道怎么做。 习题3.3,passwd的局部状态变量,在dispatch前比较下传入的密码是否与之一致 ;习题3.3 (define (make-account balance passwd) (define (withdraw amount) (if (>= balance amount) (begin (set! balance (- balance amount)) balance) "余额不足")) (define (deposit amount) (set! balance (+ balance amount)) balance) (define (dispatch pwd m) (if (eq? pwd passwd) (cond ((eq? m 'withdraw) withdraw) ((eq? m 'deposit) deposit) (else (error "Unknow request--MAKE-ACCOUNT" m))) (lambda(x) "Incorrect password"))) dispatch) 不一致的时候,返回一个匿名过程,仅仅是输出消息Incorrect password 习题3.4,在内部维持一个局部变量counter,用于计数密码错误的次数,在dispatch前判断counter是否等于7,如果是7就调用过程call-the-cops。 ;习题3.4 (define (make-account balance passwd) (let ((counter 0)) (define (withdraw amount) (if (>= balance amount) (begin (set! balance (- balance amount)) balance) "余额不足")) (define (deposit amount) (set! balance (+ balance amount)) balance) (define (call-the-cops amount) "您已经尝试输入密码7次了!不能再试!") (define (dispatch pwd m) (cond ((= 7 counter) call-the-cops) ((eq? pwd passwd) (cond ((eq? m 'withdraw) withdraw) ((eq? m 'deposit) deposit) (else (error "Unknow request--MAKE-ACCOUNT" m)))) (else (begin (set! counter (+ counter 1)) (lambda(x) "Incorrect password"))))) dispatch))
文章转自庄周梦蝶 ,原文发布时间2007-07-24
相关资源:sicp第二章练习题的解答