R6RS:翻訳:Standard Libraries:6 Records

R6RS:翻訳:Standard Libraries:6 Records

6 章 構造体

本節では構造体を表す新規データ型を作成するための抽象化法について述べる。

構造体は、フィールドと呼ばれる固定個数の構成要素を持つ合成データ構造である。各構造体は構造体記述子により特定される型と関連づけられる。この記述子は構造体のフィールドや、その型の構造体が共有するその他雑多な性質を規定するオブジェクトである。構造体オブジェクトは構造体構築子により生成される。これは、新規に構造体を作成しフィールドに初期値を設定する手続きである。異なる型の構造体は互いに区別することができ、他の型とは構造体述語により区別することができる。構造体型記述子に指定した構造体を構造体述語に渡すと #t が返り、それ以外は #f が返る。アクセサを使うと構造体からフィールドに対応する値を取り出すことができ、変更子を使うと構成要素を別の値に変更することができる。

構造体型は単一継承を使い拡張をすることができ、単一継承クラスシステムの場合と同じように、代数データ型のようなアプリケーションに現れる階層構造をモデル化することができる。構造体型 t が別の構造体型 p を拡張している場合、 t 型の構造体はそれぞれ p 型の構造体でもある。また、 p 型に適用可能な述語、アクセサ、変更子もまた t 型の構造体に適用することができる。この拡張関係は推移的で、拡張元に親があればその親の親、そしてまたその親があればその親……と拡張していく。他の構造体型を拡張しない構造体型を基底構造体型と言う。

構造体型は、拡張できないように封印することもできる。さらに nongenerative にすることもできる。すなわち、大域的には uid で識別し、以前のものと同じ uid を持ち、互換性のある nongenerative な構造体型の定義は常に同一の構造体型を生成するのである。

構造体の仕組みはみっつのライブラリにわたる。

(rnrs records syntactic (6))

構造体型と、対応する構築子、述語、アクセサ、変更子を定義する構文レイヤ

(rnrs records procedural (6))

構造体型を作成・操作し、構築子、述語、アクセサ、変更子を作成する手続きレイヤ

(rnrs records inspection (6))

調査用手続き

検査用手続きを使うと、プログラマは構造体のインスタンスからその型の記述子を取り出し、そこから構造体のインスタンスのフィールドにアクセスすることができる。この仕組みにより可搬性のある表示器や調査器を作ることができる。プログラム側で型を不透明なものと宣言して、構造体の型にアクセスできないようにすることもある。それによって構造体に格納されている情報を調査機構から保護するのである。したがって、ここで示した不透明性を抽象化のための障壁にすることもできるのである。

本報告書で触れている標準型は不透明な構造体型として実装できるものもあるしできないものもある。したがって、標準型のオブジェクトの調査に使うこともできるかもしれないのである。

手続きレイヤは特に host-compatible な構造体型を構築するインタプリタを書く場合に有用である。また、構文レイヤの拡張の対象としての役割も果たす。だがしかし、手続きレイヤで提供される構造体操作は構文レイヤで提供されるものよりも非効率なことがある。構文レイヤは、展開時に構造体のインスタンスの多きさやフィールドのオフセットを決定することができるように設計されている。したがって、構文型の構造体定義を代わりに実装するのであれば、手続きレイヤに展開されるようにするのではなく、可能ならば、構文レイヤに展開されるようにするべきである。

構文レイヤは一般的によく使われるものであるため、まずこれについて説明をする。本章ではパラメータ名 rtdconstructor-descriptor をそれぞれ構造体記述子と構築子記述子の表すのに使用する(R6RS:翻訳:Standard Libraries:6.3 Procedural layer参照)。


Last modified : 2008/03/10 02:34:32 UTC