Next: util.stream
- ストリームライブラリ, Previous: util.record
- SLIB-互換のレコード型, Up: ライブラリモジュール - ユーティリティ [Contents][Index]
util.relation
- リレーションフレームワークリレーションに対する共通の操作を提供します。
値の集合を S1, S2, ..., Sn とするとリレーション R はタプルの集合で、 タプルの最初の要素は S1 からの値で、2番目は S2 から、で n 番目は Sn からとなっている。いいかえれば、R は S1, ..., Sn の直積です。 (この定義とリレーションという用語は 1970年のCoddのペーパー "A Relational Model of Data for Large Shared Data Banks", in CACM 13(6) pp.377–387.によるものです。)
この定義はいろいろなデータベースセットにあてはまります。各インスタンス をタプルとみなし、各スロット値を実際の値と見ると、Gaucheのオブジェクト システムの集合はリレーションです。リストのリストもリレーションです。 CSVテーブルからの読み出しストリームはリレーションを生成します。このよ うことから、表現に依存しないリレーション上のジェネリックな操作を実装す るモジュールを用意することは有意義です。
操作という観点からいえば、以下の4つのメソッドがあれば、どのようなデー
タ構造もあつかえます。タプルのコレクション(行)を取り出す
relation-rows
、それから、relation-column-names
、
relation-accessor
、relation-modifier
、これらはメタ情報に
アクセスする方法を提供しています。これ以外のすべてのリレーション操作は
上のプリミティブメソッドを使って組まれています。
リレーションの具体的な実装にはダックタイピングが適用できます。
すなわち、リレーションメソッドを使うのに特定のベースクラスを継承する必
要はありません。しかし、利便のためにこのモジュールには、ベースクラス
<relation>
が用意されています。これは、ミックスインクラスのよう
な働きをします。具象クラスは典型的には<relation>
および
<collection>
または<sequence>
を継承することになるでしょう。
興味があれば、ソースツリーにあるlib/util/relation.scmに含まれる
サンプル実装をチェックするとよいでしょう。
このモジュールは現時点では開発途上にあります。計画では共通メソッド上に 有用なリレーション操作関数群を構築することになっています。
{util.relation} リレーションの抽象ベースクラス
{util.relation}
サブクラスではこのメソッドを必ず実装しなければなりません。
カラムの名前のシーケンスを返す必要があります。カラム名の型はリレーショ
ンによります。equal?
の意味で相互に異っているかぎり、カラム名に
ついて特に制限はありません。
{util.relation} サブクラスではこのメソッドは必ず実装しなければなりまん。2つの引数をと り、リレーションrの行とカラム名をとり、指定したカラムの値を返す 手続を返さなければなりません。
{util.relation} サブクラスではこのメソッドは必ず実装しなければなりまん。 3つの引数、リレーションrの行、カラム名、値をとり、その値をセット する手続を返さなければなりません。
リレーションが読み込み専用の場合はこのメソッドは#f
を返します。
{util.relation}
サブクラスではこのメソッドは必ず実装しなければなりまん。
基盤となっている<collection>
クラスまたはそのサブクラス(たとえば
<sequence>
)のインスタンスを返さなければなりません。
のこりのメソッドは上の4つのメソッドを使って組まれています。とはいえ、
<relation>
のサブクラスでは以下のメソッドを性能を得るためにオー
バーロードすることもできます。
{util.relation} columnがリレーションrにおいて有効なカラム名である場合にの み真を返します。
{util.relation}
リレーションrの行の指定したカラムにアクセスする手続を返します。
Relation-column-getter
は、1つの引数、行をとる手続きを返さなけれ
ばなりません。Relation-column-setter
は2つの引数、行と新しくセッ
トする値を取る手続きを返さなければなりません。
リレーションが読み込み専用の場合はrelation-column-setter
は#f
を返します。
{util.relation} rowはリレーションrの行です。rowのcolumnの値を 返します。columnが不正なカラム名である場合、defaultが与え られていればそれを返し、そうでなければ、エラーを示すシグナルがあがりま す。
{util.relation} rowはリレーションrの行です。valueをrowの columnに設定します。リレーションが読み込み専用の場合には エラーを示すシグナルがあがります。
{util.relation} ゲッタとセッタの完全なリストを返します。通常はデフォルトのメソッドで十 分ですが、たとえばゲッタのリストをキャッシュしたいときもあるでしょう。
{util.relation} 行をシーケンスに変換する手続きを返します。行がすでにシーケンスで表現さ れているリレーションであれば、行をそのまま返す手続きです。
{util.relation} リレーションrに新しい行を挿入可能な場合にのみ真を返します。
{util.relation} リレーションrに行rowを挿入します。
{util.relation} リレーションrから行を削除可能である場合にのみ真を返します。
{util.relation} リレーションrから行rowを削除します。
{util.relation} procを各行のカラムcolumn … の値に適用します。 seedは状態の値として渡されます。すなわち、リレーションrの 各行ごとに以下のようにprocを呼びます。
(proc v_0 v_1 … v_i seed) where v_k = (relation-ref r row column_k)
呼び出しの結果があたらしいシードの値となり、最終の結果が relation-foldから返ります。
たとえば、リレーションが amount
という名前のカラムをもつものと
し、リレーション r 内にあるそのカラムをすべて足しあわせたいとす
ると以下のように書けます。
(relation-fold r + 0 'amount)
{util.relation}
{util.relation}
Next: util.stream
- ストリームライブラリ, Previous: util.record
- SLIB-互換のレコード型, Up: ライブラリモジュール - ユーティリティ [Contents][Index]