srfi-9のレコード型を試してみた

30分プログラム、その661。Gauche Users’ Reference: Topを試してみた。
今まで、Schemeで構造化されたデータが欲しいときはリストで表現してました。

(define (make-account name balance)
   (cons name balance))
(define account-name car)
(define account-balance cdr)

だって、そうするものだって、SICPに書いてあったんだもん。
でも、これだとmake-accountしたあとの値が意味不明になって嫌ですよね。かといって、オブジェクトを使って表現するほどたいしたものじゃないですよね。そんなことを考えながら、マニュアルを眺めていたら、Gauche Users’ Reference: Topを見つけました。
これは試すしかないね。

使い方

;; 口座を作る
gosh> (define A (make-account "alice" 100)

;; 内容を確認する
gosh> (d A)
#<account 0x4b77e8> is an instance of class account
slots:
  name      : "alice"
  balance   : 100

;; 預ける
gosh> (deposite A 10)
#<undef>

;; 再度、内容を確認する
gosh> (d A)
#<account 0x4b77e8> is an instance of class account
slots:
  name      : "alice"
  balance   : 110

ソースコード

#! /opt/local/bin/gosh
;; -*- mode:scheme; coding:utf-8 -*-
;;
;; rec.scm -
;;
;; Copyright(C) 2009 by mzp
;; Author: MIZUNO Hiroki / mzpppp at gmail dot com
;; http://howdyworld.org
;;
;; Timestamp: 2009/09/21 21:42:28
;;
;; This program is free software; you can redistribute it and/or
;; modify it under MIT Lincence.
;;

(use srfi-9)

(define-record-type account
  (make-account name balance) account?
  (name name)
  (balance balance set-balance!))

(define (deposite account n)
  (set-balance! account
		(+ (balance account) n)))

(define (withdraw account n)
  (if (> (balance account) n)
      (deposite account (- n))
      'error))


(define (trans a b n)
  (if (> (balance a) n)
      (begin
	(withdraw a n)
	(deposite b n))
      'error))

(define A (make-account "alice" 100))
(define B (make-account "bob" 20))

(deposite A 100)
(balance A)
(trans A B 20)
(d A)