言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

プログラムのシルエット3

http://d.hatena.ne.jp/propella/20070825/p1 の続きです。キャンプで初めて見せたデータフロー言語のプレゼン。肝心なスタック言語の説明が上手く行かなくて失敗だ!とおもっていたけど、ジョン・マロニーさんが面白かったと言ってくれたので凄く嬉しかった。ジョンさんはデータフローの落とし穴を説明してくれて、それによると副作用と線だらけで複雑になる事だった、スコットさんも同じような経験があって、複合型の処理がややこしくなる点が落とし穴だったと言っていた。どちらも圏論で華麗に解決(予定)じゃないかと自信を持ったのでした。

あと、内部表現として作った Joy もどき言語は、俺って天才と思うあまり心が震えて声が出なくなるほど凄い(変な)言語で、詳しく説明する気力は無いがとりあえず記す。

  • 小学生でも実装できる言語仕様を目指しているので遅延評価は全く行わない。全くというのは言葉通り if 文でさえ遅延評価しない。if 文(ややこしいので実際は opt という別のキーワードを使用)の三つの引数(条件、真の結果、偽の結果)は if 文が実行する前に評価される。
  • 実行スタックも無い(Linear Logic)。例えば if 文では、同じ変数を条件でも結果でも使う時は明示的に dup が必要(Joy では条件文実行後にスタックが元に戻る)。
  • dup はディープコピーでは無くてただのエイリアスを作る。
  • 上の三つの仕様は、純粋すぎて実用性に欠けると思いきや、この言語をデータフロー作成言語と考えると大変便利。例えば(普通の言語風に書くと)、3 + 4 は即値で 7 を返し、x + 4 は後で 4 を加えるすデータフローを返す(+ がポリフォミックに定義されている)。if true 1 2 は 1 を返すが、同じく if x y z は x の値に応じて y か z を返すデータフローを返す。(if がポリフォミックに定義されている)。データフロー言語自体の実行は IO モナドのように環境(この場合 etoys)が行うので、言語に遅延評価が無くても問題無い。
  • つまり、データフローの作成をコンパイルと考えると、この言語はポリモフィズムを使ってインタプリタコンパイラの両方の役目を果たす。
  • 面白い事は、dupdip 等のスタック操作関数にポリフォニズムが必要ない所。このスタック操作によって「シルエット」が生成される。
  • 圏論 (というか Arrow) は Haskell よりもスタック言語の方が綺麗に書けるというのはまだ妄想段階で、実装していない。具体的には、タプルの代わりにリストで平行 Arrow を表現する。そのリストはスタックとみなせるし、Arrow 一本の場合と複数本の場合の表現同じになるので美しい。現在は完全に etoys に任せているデータフローの実行も、Arrow を使う事によって言語の中で完結させられる(予定)。
  • 話は変わるが、postscript がスタック言語を採用した理由って何だったんだろう。同じ理由(一つのノードをあちらこちらで参照したい)だったら笑えるな。全然歴史に学んでないな、俺達。

本当に、この特徴をおかずにご飯が三杯イケルほどこの悟りに感動したのだが、全くこの感動を伝えられない自分のプレゼン能力の低さが悔しい。もしくは私が狂ってるかのどちらかか。