レコード型を拡張する


Tags: R6RS, レコード

R6RS レコードは単一継承により拡張することができる。親となるレコード型は define-record-type の parent 節で指定する。

例えば直交座標系の点 (x, y) を表すレコード型 point があったとき、それに色をつけた点を表す colored-point は次のように定義できる。

(import (rnrs))

(define-record-type point
  (fields
   (mutable x)
   (mutable y)))

(define-record-type colored-point
  (parent point)
  (fields
   (immutable color point-color)))

子型の構築子はまず親型のフィールドに対する引数を取り、続いて自身で宣言したフィールドに対する引数を取る。既存のレコード型を拡張したレコード型のインスタンスには親型のインスタンスに対する手続きも適用することができる。逆は真ではない。

(define p (make-point 2 7))
(define cp (make-colored-point 3 5 'blue))

(point? p) ; => #t
(point? cp) ; => #t

(colored-point? p) ; => #f
(colored-point? cp) ; => #t

(point-x p) ; => 2
(point-x cp) ; => 3

(point-x-set! cp 0)

(point-x cp) ; => 0
(point-y cp) ; => 5

(point-color cp) ; => blue
(point-color p) ; => &assertion