文責: | @naoiwata |
---|
プログラムにおける データ の定義について考察する.
前節で有理数を定義し, その定義に基づいて有理数を実装した.
有理数の定義を, 構成子と選択子で実装されるもの, 即ち有理数とは make-rat, numer, denom の 3 つの手続きで規定することのできるデータ抽象の手続きであると, 定めた. しかし, この定義は有理数の定義として充分なのか, 定義足りうるのかをもう一度考察しようと思う.
これに対して上の命題は不十分であると言える. 何故なら, make-rat, numer, denon を定義するには
この 2 つが真であることが前提だからである.
よって,
と言えるように見える.
整理すると, 有理数というデータを定義するための条件は以下の 3 点である.
有理数の場合は,
を満たしているデータであるといえる.
このデータの定義を有理数にとどまらず, 更に下層レイヤーのデータオブジェクトについても同様に定義できることを明示する. 言語に用意された対(Pairs) 手続きである cons, car, cdr について考えてみよう.
上の定義と同じく考えるならば, 対(Pairs) は,
同様に, (1)~(3) の条件を満たせば対(Pairs) を表現できることが分かる. これは即ち, 言語に組み込まれた対の定義を用いること無く対を表現できることを意味している.
(define (cons x y)
(define (dispatch m)
(cond ((= m 0) x)
((= m 1) y)
(else (error "Argument not 0 or 1 -- CONS" m))))
dispatch)
(define (car z) (z 0))
(define (cdr z) (z 1))
ポイントその 1
対の定義さえ満たせばそれは対とみなせる. 対というデータがどうあるべきかは誰も何も問わないし, 考える必要がない.
ポイントその 2
cons の実装は戻り値が手続きとなっている. ポイントその 1 と同じく, データ構造を使う実装である必要はない. データ構造を使う ように見える 実装であれば充分である.
オブジェクトとして扱うことのできる手続きは合成データを表現し得る.
データとして振る舞う手続きをメッセージパッシングと呼ぶ. 詳しくは 3 章以降で取り扱う.
本説ではプログラムにおけるデータの定義について考察した.