SICPゼミ第14回

3章のテーブル演算の実装を読んでから2章の残りに帰ってくることにしました。

練習問題3.1
(define (make-accumulator initial)
  (lambda (amount)
    (begin (set! initial (+ initial amount))
      initial)))

by pine

練習問題3.2
(define (make-monitored func)
	(define count 0)
	(define (dispatch m)
		(if (eq? m 'how-many-calls?)
			count
			(begin (set! count (+ count 1)) (func m))
			)
		)
	dispatch
	)

by dolicas

練習問題3.3
(define (make-account balance password)
  (define (withdraw amount)
    (if (>= balance amount)
        (begin (set! balance (- balance amount ))
               balance)
        "Insufficient funds"))
  (define (deposit amount)
    (set! balance (+ balance amount ))
    balance)
  (define (dispatch pw m)
    (if (eq? pw password)
        (cond ((eq? m 'withdraw) withdraw)
              ((eq? m 'deposit) deposit)
              (else (error "Unknown request: MAKE-ACCOUNT"
                           m)))
        (error "Incorrect password")))
  dispatch)

by tube

練習問題3.4
(define (call-the-cops .x)
  (display "police"))

(define (make-account balance)
  (let ((pass-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 password m)
      (if (eq? password 'secret-password)
          (begin (set! pass-count 0)
            (cond ((eq? m 'withdraw) withdraw)
                  ((eq? m 'deposit) deposit)
                  (else (error "Unknown request: MAKE-ACCOUNT" m))))
          (if (= pass-count 6)
              call-the-cops
              (begin (set! pass-count (+ pass-count 1))
                (error "Incorrect password")))))
    dispatch))

by pine