クロージャでオブジェクト

30分プログラム、その505。ひさしぶりなので、簡単なやつからゆっくりと。
先延ばしにしてきた年金をそろそろ払わないといけないけど、MacBookAirを買ってしまってお金がない! というわけで貧乏人のオブジェクトこと、クロージャで銀行口座オブジェクトを作ってみました。

使い方

;; 初期金額100ドルで口座を解説する
(define my-account (account 100))
(define your-account (account 100))

;; 50ドル引き出す
(my-account 'withdraw 50)

;; 200ドル預ける
(my-account 'deposite 200)

;; お金を振り替える関数
(define (trans src dest amount)
  (if (eq? (src 'withdraw amount) 'error)
      'error
      (dest 'deposite amount)))

ソースコード

(define (account amount)
  (define (withdraw x)
    (if (<= x amount)
	(set! amount (- amount x))
	'error))
  (define (deposite x)
    (set! amount (+ amount x)))
  (define (balance)
    amount)
  (lambda (msg . args)
    (case msg
      ((withdraw) (apply withdraw args))
      ((deposite) (apply deposite args))
      ((balance)  (apply balance  args)))))

(define (trans src dest amount)
  (if (eq? (src 'withdraw amount) 'error)
      'error
      (dest 'deposite amount)))

(define my-account (account 100))
(define your-account (account 100))

(my-account 'withdraw 10)
(my-account 'deposite 200)