てきとう

てきとう

妄想

Brainf*ckに(その思想からは外れる気もするけど)並列処理を加える。
既にBrainforkという先達がいるんだけど、そいつはあんまり面白くない。
面白そうなのではWeaveがあるんだけどメモリ共有なので、メッセージパッシングなのがほしい。
という訳で妄想開始。

'+', '-', '<', '>', '[' と ']'
省略。
'{' and '}'
'{'から対応する'}'までを別なスレッドで実行。実行開始後は現在のセルにスレッドIDが代入される。
':' と ';'
現在の出力先/入力元を現在のセルの値に等しいIDのスレッドにする。
'.' と ','
現在の出力先にセルの値を書き込む/セルに現在の入力元から値を読み込む。

ただし、スレッドIDはデフォルト値 0で標準入出力を、1で「そのスレッドが生成されたスレッド」を指す。
たとえば、

{+;,++++.}:
>{+:>++++[>++++[>++++<-]<-]>>.};
>,.

というプログラムは、

  1. 現在のスレッド Taから新しいスレッド Tbを起動し、
    1. セルを1で初期化し、
    2. 入力元を1(=Ta)にし、
    3. 1文字読んでそれに4を足して標準出力に書く。
  2. Taの出力元をTbにし、
  3. Taで新しいスレッド Tcを起動し、
    1. セルを1で初期化し、
    2. 出力先を1(=Ta)にし、
    3. 64を代入し、
    4. セルの値を書く。
  4. Taの入力先をTcにし、
  5. 1文字読み込んで1文字書く。

結果、標準出力に68(='D')を出力する。はず。
子スレッドを無限ループさせておけば関数的にも使えるし、

{+;:[,+++.]};:>
+++.,>[-]:.

{}をネストさせれば無制限にスレッドが作れる。

{{{+}+}+}++[>{+}<-]+>{+}+


うーん、、、あんまり面白くないな。
1つのスレッドだと最大254個しか作れないから、[]内でスレッドを作っても最大254個しかできないし…。