selflearn @ ウィキ

SICP(2.1 データ抽象入門)

最終更新:

kato

- view
メンバー限定 登録/ログイン

『2.1 データ抽象入門』

まとめ

1章で取り扱った手続きによる抽象に加えて、複数のデータオブジェクトを組み合わせて合成データを作り、データも抽象化することで表現力が強化される(らしい)。
そのサワリについて紹介している。

また、2章の冒頭では以下のキーワードが強調されていた。後々説明があると思うけれど、ここでも載せておこう。
  • 合成データ(compound data) / 合成データオブジェクト(compound data object)
  • データ抽象(data abstraction)
  • 抽象の壁(abstraction barrier)
  • 閉包(closure)*1
  • 公認インタフェース(conventional interfaces)
  • 記号式(symbolic expressions)
  • 汎用演算(generic operations)
  • データ主導プログラミング(data-directed programming)
うん、ワクワクするようなキーワードばかりだ。

各小節の内容

2.1.1 例:有理数の算術演算

データ抽象
基本的なデータ・データ構造から抽象的なデータを構成し、「どうやってデータを作ったか」という具体的な実装の細部から隔離すること。

有理数を実現する合成データを構成し、内部の実装にこだわらないデータ抽象を実現している。
ここで、Schemeでもっとも重要になるであろう手続きが紹介されている。

cons
2つの引数を対(pair)にした合成データオブジェクトを返す。constructの省略された形。
car
consで構成した対に対して左側を返す。リストの場合は最左部のみ返す。Contents of Address part of Registerという長い文言の省略形。
cdr
consで構成した対に対して右側を返す。リストの場合は最左部(=car)を除く残りをリストで返す。Contents of Decrement part of Registerの省略形。長いよ。

上の手続きはいずれもScheme/Lisp入門書には真っ先に書いてある(だから余計分からない)手続きなので、何としても覚えておこう。

それにしても、consがconstructの略だとは知らなかった。初めからそう言ってもらえればよかったのに。*2

ここで、「希望的思考(wishful thinking)」と称して、まだ合成データの詳細が決まっていないのに、先に有理数の四則計算を行う手続きを定義している。これは、アジャイルにおけるテストファーストに近いような気がするなあ。

あ、あと次のような語句も出ていた。その後の問題で何回か出ているから、ノートしておこう。

選択子(selector)
合成データオブジェクトからなる「抽象データ」。上位プログラムによって使われ、内部の実装を隠蔽している。
構成子(constructor)
選択子を構成する「具体的なデータ表現」。データを使うプログラムから独立して定義するべき。

2.1.2 抽象の壁

抽象の壁とは、抽象化の階層構造を定義することで階層内の実装の自由度を上げる方法。
今回の有理数では、

抽象度 手続き・ターゲット
ユーザープログラム(問題領域を取り扱う)
add-rat,sub-rat,...(分子と分母によって有理数を取り扱う)
make-rat,numer,denom(対によって有理数を取り扱う)
cons,car,cdr(対の実装。どんな方法でもよい)

というように「分割して統治」している。このような抽象の壁・階層を、自分で作るプログラムにも取り入れることが必要。モジュール化という考えはできる(と思う)んだけど、階層の考えを取り入れることが苦手なんだよなぁ。


2.1.3 データとは何か

「データ」とは以下の3つによって定義される。

  • 選択子
  • 構成子
  • 上記を有効な表現とするための条件

ということで、cons/car/cdrにとっての条件を紹介している。

(cons x y) xとyからなる対zを生成する
(car z) zのうちxを返す
(cdr z) zのうちyを返す

上記が満たされる手続きであれば、内実はどのような実装であっても構わないし、問題も無い。ここで重要なのは、『手続きをオブジェクトとして操作する能力が自動的に合成データを表現する能力を提供している』こと、と書いてある。これをメッセージパッシングとも呼ぶらしい。

ん?どういうことだろう。「手続きをオブジェクトとして〜」という表現は、資料中での独自consが手続きを返していることや、その手続きに対して0や1を渡すことで結果を得ていることに該当しているみたいだけど、それとメッセージパッシングという表現とがまだつながらない。

問題2.4-2.6に取り組みながら、もう少し考えてみることにする。

→ 取り組んでみた(2.6で相当苦労したけれど)。「メッセージパッシング」という言葉をオブジェクト指向言語のメソッド呼び出しとして考えていたけれど、ここではデータを手続きという概念の枠で表現し、取り扱うことを言っているみたいだ。
もう少し明確になるには、3章まで進めてみないことにはダメそう。頑張れ。→自分


2.1.4 拡張問題:区間算術演算

ここでは抵抗が持つ誤差の区間を合成データとして表現していき、その中で出てくる問題を(読者が)解決するという話。特に新しい概念を説明しているわけではなく、合成データのまとめと言った感じかな。

でも問題がとても難しいので、挫折。写経して学ぶことにしようと思う・・・。とほほ。

タグ:

SICP scheme
記事メニュー
目安箱バナー
注釈

*1 よく言われるクロージャではなく、要素が対である対を作る能力のこと。

*2 大学時代にLispを習って、一度consやcar、cdrの意図が分からず挫折しているから。