Acme::ICFP2006::2D

作ってみようかと思ってます。なんか面白そうだ、これ。
なのですが、とりあえず自分で2Dのプログラムくらいかけなきゃダメだよね、と思った。こないだはid:letter氏の横でほとんど見ていただけなので、自分でコーディングが出来るか不安だったけれど、さくさくっとmultが書けてしまった今日この頃。ペトリネットとか書けても、何の役に立つんですか一体。
ところで、今その実装を考えているわけだけれど、ふと思ったこととしてこの2Dにおいて、一つのModule内でループ構造が出来ている場合はどうしたらいいんだろう、と。あるいは評価順序が結果に影響しないのか、と。ペトリネット自体は発火の順序は決めてやらなくてはならないということが一般的に知られているらしい。けれども、実はこの2Dという言語はその曖昧性を排除できているのではないか。
一つのモジュールの中において、出力が必ず一方向に一つであるという仕様が、イグニッションにおける連鎖の制限をかけているせいではないだろうか。あるいは、どう頑張ってもこの言語上におけるモジュールが一度発火した場合、そのモジュールの中で再帰呼び出しをされる以外の方法では同じBoxは発火することがありえないということを言うことができるのではないか。多分後者はそれなりに簡単に説明が出来るような気がする。
例えば、あるBoxが一度のModule呼び出し中に二回発火したとする。そうすると、その呼び出しもとのBoxも二回ずつ発火していることになる。あるいはその呼び出し元がModuleの呼び出し元だった場合にModuleの呼び出しが一回なのにも関わらず二回も入力を受け取っていることになる。であれば、一回のModule呼び出しでは、各Boxは高々1度しか発火しない。
こう考えると、実はこの2Dでは発火の順序というのは考えてやらなくてもよさそうだ。ただし、再帰呼び出しという概念はあるので、それをきちんとStackにつんでやらなくてはならない。めんどくさい。でもやる。