R6RS Record をサポートしよう その1
仕様把握
R6RSを眺める。protocol の説明がしんどいが読み進める。概要は把握。
psyntax はどこまでサポートしてくれるのか?の境界があいまいでドキュメントもないので調べる。
基本的に define-record-type の難しい部分を全部引き受けてくれるみたい。
rtd 周りは処理系が実装するということかな。
機械的に psyntax を調べたら以下のような状況。
手続き | psyntaxで定義済み? | 実装メモ |
---|---|---|
(define-record-type |
○ | |
(record-type-descriptor |
○ | |
(record-constructor-descriptor |
○ | |
(make-record-type-descriptor name parent uid sealed? opaque? fields) | × | |
(record-type-descriptor? obj) | × | そのまま |
(make-record-constructor-descriptor rtd parent-constructor-descriptor protocol) | × | |
(record-constructor constructor-descriptor) | × | |
(record-predicate rtd) | × | |
(record-accessor rtd k) | × | |
(record-mutator rtd k) | × | |
(record? obj) | × | |
(record-rtd record) | × | そのまま |
(record-type-name rtd) | × | そのまま |
(record-type-parent rtd) | × | そのまま |
(record-type-uid rtd) | × | そのまま |
(record-type-generative? rtd) | × | |
(record-type-sealed? rtd) | × | そのまま |
(record-type-opaque? rtd) | × | そのまま |
(record-type-field-names rtd) | × | そのまま |
(record-field-mutable? rtd k) | × | そのまま |
テストコード作成
簡単なテストコードを作る。R6RSにある Point 構造体の例で良さそう。
(define-record-type (point make-point point?) (fields (immutable x point-x) (mutable y point-y set-point-y!)) (nongenerative point-4893d957-e00b-11d9-817f-00111175eb9e)) (define-record-type (cpoint make-cpoint cpoint?) (parent point) (protocol (lambda (n) (lambda (x y c) ((n x y) (color->rgb c))))) (fields (mutable rgb cpoint-rgb cpoint-rgb-set!)))