前田 薫くんのお薦めで,Scala開眼の冒頭だけ読んでみました.よく書けてますね.これ読んだ人がScalaに興味を持ってくれることを期待します.
でも,以下に引用した最後の方の記述はおかしい.
Lispのような関数型言語とは、本質的には『問題を複雑系として把握しそのままモデル化する』もの
ここで用いられている「複雑系」はcompound data structureとかを意味しているんだと思うんです.いわゆる複雑系はカオス理論との関連で論じられるもので,明瞭な再帰構造が見えたり,再帰的に解析できるようなわかりやすいものではありません.
ちなみに,Scala開眼の最後の方の記述は,おそらくSICP (Structure and Interpretation of Computer Programs)のストーリーに拠っているんでしょうね.SICPの第一章に以下の記述(私家版の訳です)があります:
十分に強力な(プログラミング)言語は(より単純なアイデアの組み合わせから,より複雑なアイデアを記述する目的で)以下の機構を提供している.
- 原子的な式:およそ言語が対象とする最も簡単なものを記述する能力
-
複合:より単純な要素から複合体を構成する能力
-
抽象化機構:複合的な要素を明々して単体で扱えるようにする能力
分子の世界に例えとわかりやすいです.原子的な存在としては元素があります.炭素(C)とか水素(H).さて,炭素原子と四つの水素原子を組み合わせたCH4という分子があります.ここまでは自然界の摂理.この5つの原子を組合せたCH4という複合体を扱うときには,これを「一つの炭素原子と四つの水素原子が組み合わさった分子」のかわりに,メタンという名前で呼ぶことにしよう.名前をつけるだけでなく,メタンも原子のようにほかのものとくっついてさらに大きな分子が作れるものとして考えよう.このような考え方をプログラミングの文脈で語っているのが前述の三つのアイデアです.
(よい意味でも悪い意味でも)モノに言葉を与えることでわかったような気になります.まっとうなプログラミング言語であればその機構を提供しているはずだということです.
上に訳した三つの点はSICPのマントラです.あまりに自然に書かれているために気づきにくいかもしれないけれども,再帰,代入,オブジェクト指向とさまざまなトピックについて,さまざまな例題で掘り下げることでSICPはこれだけをひたすら繰り返し唱えているように思えます.これ以外に重要なことはないかのように.
だからSICPを読む人は一節読み進むごとに一章の最初のページに立ち戻って復習して下さい.とても勉強になります.