@uents blog

Code wins arguments.

SICP 読書ノート#26 - 第2章 まとめ

最後は端折ってしまいましたが、長い長い2章がようやく終わったので、 自分なりにまとめたいと思います。(1章でもまとめておけばよかったorz)

***

ところで、この章で学ぶべきものは何でしょうか?

それは「§2.1.3 データとは何か」の以下の一節を理解することかと考えます。

... ところでデータ(data)とは正しくは何なのか. 「与えられた選択子と構成子で実装されているもの」というのでは不十分だ...

一般に, データは選択子と構成子と, これらの手続きを有効な表現とするために 満たすべき条件とで定義されると思ってよい.

さらに注釈には、データの形式化として2つの方法を述べています。

驚くべきことにこの考えを厳密に形式化するのは非常に難しい. 形式化に二つの方法がある.一つは.... 抽象モデル(abstract model)の方法として知られている....

一般に, 抽象モデルは新しい種類のデータオブジェクトを, 前もって定義されたデータオブジェクトの型を使って定義する...

もう一つの方法は... 代数的仕様(algebraic specification)という. これはわれわれの「条件」に対応する公理でシステムの行動を規定する 抽象代数システムの要素として「手続き」を見, データオブジェクトに対する表明を 検査するのに抽象代数の手法を使う.

データとは、単なる数値や文字列のような値を指すのではなく、 何らかのモデルを選択子と構成子というインターフェースで抽象化したものと定義されます。 いわば、オブジェクト指向言語のオブジェクト(クラスやインスタンス)の方が イメージとしては近いでしょうか。

そこで、データの内部を構築する手段としてconsやlistおよび閉包性、 抽象化のための外界とのインタフェースとして、 データ主導やメッセージパッシングの技法を学びました。 しかも、データを抽象化する手段として一般的にこれらの技法は有用であるけれども、 決して銀の弾丸ではないというおまけ付きです。これは嬉しかった。

もちろん公認インターフェースで学んだ map、filter、accumulate のように データをパイプライン処理のように扱う技法も重要だと思います。 (これらを使いこなせないと、いたずらに入れ子なループで数え上げる 手法に頼らざるをえないので)

また、SICPを読むまで関数プログラミングを全く知らなかったのですが、 ひと言でいえばデータストリーミングですね。(知らなかったというより、 これが関数プログラミングという認識がなかったと言う方が正しいかも)

***

しかし、選択子といっても2章ではgetterメソッドしか扱ってきませんでした。 すなわち、これまで扱ったオブジェクトは基本的にimmutableでした。

3章では早々にsetterメソッドを扱うようです。 setterメソッドを扱うということは、オブジェクトはmutableであり、 その局所状態を考える必要があります。局所状態が絡みあうとプログラムは 急激に複雑になりますが、それに対してどのような技法が用意されているのか 非常にワクワクしています。

3章がいまからとても楽しみです。


※「SICP読書ノート」の目次はこちら