http://d.hatena.ne.jp/propella/20070806/p1 の続き。プレゼン版
では今からプログラムのシルエットについて話します。
これは何でしょう。
形のよく分かる影と分かりにくい影があります。
これなんか本体より影の方が分かりやすい。
プログラムにも影があります。よい影はプログラムの条件やループをよく表します。「美しいプログラムとは、美しい影を持つプログラムである」という定義は如何でしょうか?
etoys の影はまあまあです。これは猫が落ちるシミュレーションです。
scratch の影はかなり面白いです。
しかし考えてみると、例えば「猫が落ちる」というシミュレーションでは条件やループはどうでも良い事で、x 座標と y 座標に依存関係が無いというデータの姿の方がよっぽど大切な事です。
データフロー言語を使うと、データの依存関係をシルエットとして表現出来ます。
猫が落ちて下で跳ね返るプログラムです。条件文は ? ブロックを使って記述します。? の入力の上から、条件、真の結果、偽の結果です。
既存のデータフロー言語と違いは?
内部でスタック言語を使っています。
スタック言語を使うと、一時変数を使わないで複雑なグラフを表現出来ます。一時変数の無い S 式では二方向から参照される同じノードを表現できません。また、スタック言語はコンビネータ論理に基づくため、ラムダ代数より簡単にプログラム変換が出来ます。これはデータフロー言語をリファクタリングツールとして使う際に、意味を変えないで表現を変える為に有用です。
副作用やベクトル、行列等を統一的に扱うために圏論を使います。
沢山の要素が跳ね返るデモです。
おまけ: ブックモーフのページを png としてエクスポートする。 Export all pages in a BookMproh.
self pages keysAndValuesDo: [:i :page | PNGReadWriter putForm: page imageForm onFileNamed: 'page', i asString, '.png'].