星田さんの記事に対するコメント。
今回は簡単に。
おお!messageの引数によってコマンドが変化する。これは・・・無茶苦茶応用が利きそうだな!以前Scheme入門かなにかのところで同じような口座管理のコードがあったけど今回のほうがすごく分かりやすい(気がする)
うん、こういう分かりやすいコードを書く、ってのが元ネタのピーター・ノーヴィッグ先生のコードの良いトコです。彼の書くコードはマジで視認性が高い。何やってるか分かりやすい。
敢えてRacketで・・と書かれてるということはSchemeでは微妙に違うということか・・・
いや、多分他のScheme処理系でも大丈夫でしょう。
matchとか、仕様に入ってない関数とかマクロには気をつけないとなんないけど、そうじゃない場合はそこそこ共通してるから大丈夫なんじゃないかな・・・・・・?
そしてcaseとlambda、なるほど〜(・。・; この関数を記録しておけば、テキストベースのゲーム的な動作って解決する予感があるな・・。
ええとそれでですね。
これはちょっとオブジェクト指向に入りすぎてるのね。
で、SICPなんかはどっちかっつーと否定的なのよ(笑)。
その代わりだ。SICPはオブジェクト指向的な書き方より、データ駆動型プログラミングを推奨してます。まぁ、結果やってる事は基本同じなんだけど、一回SICPの2.4(特に2.4.3)を読んでみた方がいい。
あるいは、SICPがイマイチだと思うならPAIPの172ページ辺りに目を通してみる。ただ、多分説明が細かいのはSICPの方かな、今回ばっかは。
データ駆動型プログラミングってのは必ずしも関数型言語流儀じゃあないんだけど(連想リストを破壊的変更する可能性がある)、かなり役に立ちます。オブジェクト指向と比較してみても良い。
んでだな。我々のようなラムダ屋としてはだ(笑)。
ラムダ式さえ理解してれば、ソフトウェアを作る際の二本柱は
- Read-Eval-Print Loopと言う考え方(特にEval設計)
- Evalを組み立てる際に役立つデータ駆動型プログラミングと言う考え方
って事になる。
もちろん、アルゴリズムで細かいテクニックは色々とあるけれども。ラムダ屋向けに対してのコンピュータ・サイエンス的な大きなパースペクティブはこのたった2つしかないの。すげぇだろ(笑)?
Lispやってると極端な話、コンピュータ・サイエンスのオチはこの2つしかない。他のプログラミング言語入門だとデータ型の紹介しかしないんで、あとは徒手空拳するしかねぇんだけど、Lispを学ぶと極論、この2つに結論は集約される。この観点に立てる、ってのがLispを学んで実用的には一番重要な点になるわけだ。
これが「初心者に易しい」とか誤解されてる、例えばJavaScriptなんかじゃあ。全然JavaScriptに関係ないDOMばっか弄るハメになって、混乱に混乱を重ねてコードがスパゲティ化して行っては、結局何をやってんだか書いてる本人も分からなくなったりする。良くあるパターンだよな。
Lispを学べば、「入出力を完全にロジックから切り離して」考える視点を手に入れられるし、如何にスパゲティ化させずにコードを書くのかそういう訓練も出来る。
今、星田さんは「悟り」を得られるトコに近づいているんです。
LISP を勉強しておきたいのは、別の理由からです――それをモノにしたときにすばらしい悟り体験が得られるのです。この体験は、その後の人生でよりよいプログラマーとなる手助けとなるはずです。たとえ、実際には LISP そのものをあまり使わなくても。