练习 3.3

以下是带密码验证功能的 make-account 函数的定义:

;;; 3-make-account.scm

(define (make-account blance password)

    (define (withdraw amount)
        (if (>= blance amount)
            (begin (set! blance (- blance amount))
                   blance)
            "Insufficient funds"))

    (define (deposit amount)
        (set! blance (+ blance amount)))

    (define (password-match? given-password)                            ; 新增
            (eq? given-password password))                              ;

    (define (display-wrong-password-message useless-arg)                ; 新增
        (display "Incorrect password"))                                 ;

    (define (dispatch given-password mode)          
        (if (password-match? given-password)                            ; 新增
            (cond ((eq? mode 'withdraw)
                    withdraw)
                  ((eq? mode 'deposit)
                    deposit)
                  (else
                    (error "Unknow request -- MAKE-ACCOUNT" mode)))
            display-wrong-password-message))                            ; 新增

    dispatch)

上面的 make-account 沿用了书本 153 页原来的 make-account 的大部分代码。

display-wrong-password-message 的定义和调用方式有点奇怪,主要是因为 dispatch 要求我们必须返回一个接受单个参数的函数(否则解释器会报错),所以为了兼容性考虑, display-wrong-password-message 接受一个不会用到的参数,并且作为 dispatch 的其中一个分派函数。

测试:

1 ]=> (load "3-make-account.scm")

;Loading "3-make-account.scm"... done
;Value: make-account

1 ]=> (define acc (make-account 100 'secret-password))

;Value: acc

1 ]=> ((acc 'secret-password 'withdraw) 40)

;Value: 60

1 ]=> ((acc 'some-other-password 'deposit) 60)
Incorrect password
;Unspecified return value

讨论

blog comments powered by Disqus