Brainf*ckに(その思想からは外れる気もするけど)並列処理を加える。
既にBrainforkという先達がいるんだけど、そいつはあんまり面白くない。
面白そうなのではWeaveがあるんだけどメモリ共有なので、メッセージパッシングなのがほしい。
という訳で妄想開始。
- '+', '-', '<', '>', '[' と ']'
- 省略。
- '{' and '}'
- '{'から対応する'}'までを別なスレッドで実行。実行開始後は現在のセルにスレッドIDが代入される。
- ':' と ';'
- 現在の出力先/入力元を現在のセルの値に等しいIDのスレッドにする。
- '.' と ','
- 現在の出力先にセルの値を書き込む/セルに現在の入力元から値を読み込む。
ただし、スレッドIDはデフォルト値 0で標準入出力を、1で「そのスレッドが生成されたスレッド」を指す。
たとえば、
{+;,++++.}: >{+:>++++[>++++[>++++<-]<-]>>.}; >,.
というプログラムは、
- 現在のスレッド Taから新しいスレッド Tbを起動し、
- セルを1で初期化し、
- 入力元を1(=Ta)にし、
- 1文字読んでそれに4を足して標準出力に書く。
- Taの出力元をTbにし、
- Taで新しいスレッド Tcを起動し、
- セルを1で初期化し、
- 出力先を1(=Ta)にし、
- 64を代入し、
- セルの値を書く。
- Taの入力先をTcにし、
- 1文字読み込んで1文字書く。
結果、標準出力に68(='D')を出力する。はず。
子スレッドを無限ループさせておけば関数的にも使えるし、
{+;:[,+++.]};:> +++.,>[-]:.
{}をネストさせれば無制限にスレッドが作れる。
{{{+}+}+}++[>{+}<-]+>{+}+
うーん、、、あんまり面白くないな。
1つのスレッドだと最大254個しか作れないから、[]内でスレッドを作っても最大254個しかできないし…。