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!)))

設計

設計はいつものようにノートに色々描く。一番問題になりそうな部分は setter/getter/constructor を生成して返す部分。
Mosh 的に Closure をどのように動的に返すかは今まで避けてきた問題だが。どうしようかな。


と思っていたのだけどプールで良いアイデアを思いつく。その後、帰宅し図にまとめる。
いけそうなので試験実装。速度調査も行い結果は良好(遅くならない)。
明日本実装に踏み込もう。 (rev277)