さかもとのブログ

つらつらと

SICP演習問題3.1~3.8

;;excercise3.1
(define (make-accumulator base-number)
  (lambda (number)
    (set! base-number (+ base-number number))
    base-number))

;;excercise3.2
(define (make-monitored function)
  (let ((count 0))
    (lambda (args)
      (cond [(number? args)
             (set! count (+ count 1))
             (function args)]
            [(eq? args 'how-many-calls?)
             count]
            [else
             (error "Known request -- MAKE-MONITORED" args)]))))
;;excercise3.3
(define (make-acount balance passwd)
  (define (withdraw amount)
    (if (>= balance amount)
        (begin (set! balance (- balance amount))
               balance)
        "Insufficient funds"))
  (define (deposit amount)
    (set! balance (+ balance amount))
    balance)
  (define (dispatch your_passwd message)
    (print passwd)
    (print your_passwd)
    (if (eq? your_passwd passwd)
        (cond [(eq? message 'withdraw) withdraw]
              [(eq? message 'deposit) deposit]
              [else (error "Unknow request -- MAKE-ACCOUNT"
                           message)])
        "Incorrect password"))
  dispatch)
;;excercise3.4
(define (make-acount balance passwd)
  (define wrong-count 0)
  (define (withdraw amount)
    (if (>= balance amount)
        (begin (set! balance (- balance amount))
               balance)
        "Insufficient funds"))
  (define (deposit amount)
    (set! balance (+ balance amount))
    balance)
  (define (dispatch your_passwd message)
    (if (eq? your_passwd passwd)
        (cond [(eq? message 'withdraw) withdraw]
              [(eq? message 'deposit) deposit]
              [else (error "Unknow request -- MAKE-ACCOUNT" message)])
        (begin
          (print wrong-count)
          (set! wrong-count (+ wrong-count 1))
          (if (< 3 wrong-count)
              "call-the-cops"
              "Incorrect passwd"))))
  dispatch)

;;;excercise3.7
(define (make-acount balance passwd)
  (define (withdraw amount)
    (if (>= balance amount)
        (begin (set! balance (- balance amount))
               balance)
        "Insufficient funds"))
  (define (deposit amount)
    (set! balance (+ balance amount))
    balance)
  (define (password-update new-password)
    (set! passwd new-password))
  (define (dispatch your_passwd message)
    (if (eq? your_passwd passwd)
        (cond [(eq? message 'withdraw) withdraw]
              [(eq? message 'deposit) deposit]
              [(eq? message 'password-update) password-update]
              [else (error "Unknow request -- MAKE-ACCOUNT"
                           message)])
        "Incorrect password"))
  dispatch)

(define (make-joint acount old-password new-password)
  ((acount old-password 'password-update) new-password)
  acount)

;;;excercise3.8
(define temp 1)
(define (f x) (set! temp (* temp x)))
(+ (f 0) (f 1))
(+ (f 1) (f 0))