Brainstuck
スタック言語の最小言語ってどんな感じかなぁと考えていて以下のような言語を考えました。
+ => スタックトップに 1 を足す - => スタックトップに 1 を引く 0 => スタックに 0 を積む : => スタックトップを取り除き、その値の深さの値をスタックに積む . => スタックトップを取り除き、その値を標準出力に吐く , => 標準入力から 1Byte 受け取り、スタックに積む [ => スタックトップを取り除き、その値が 0 なら対応する ] の次にジャンプ ] => 対応する [ にジャンプ
説明が必要なのは : だけでしょうか。 0: がスタックの一番上をコピー、 0+: でスタックから二番目の値をコピー、です。
実装はほとんど BFI.c です。
diff はこれだけ。
--- BFI.c 2007-07-14 09:15:25.000000000 +0900 +++ BSI.c 2007-07-14 09:15:07.000000000 +0900 @@ -76,20 +76,20 @@ else if (p[pc] == 45) x[xc]--; // '.' - else if (p[pc] == 46) putchar(x[xc]); + else if (p[pc] == 46) putchar(x[xc--]); // ',' - else if (p[pc] == 44) x[xc] = getchar(); + else if (p[pc] == 44) x[++xc] = getchar(); - // '>' - else if (p[pc] == 62) xc++; + // '0' + else if (p[pc] == 48) x[++xc] = 0; - // '<' - else if (p[pc] == 60) xc--; + // ':' + else if (p[pc] == 58) x[xc] = x[xc-x[xc]-1]; // '[' else if (p[pc] == 91) { - if (x[xc] == 0) { + if (x[xc--] == 0) { pc++; while (l > 0 || p[pc] != 93) { if (p[pc] == 91) l++;
たぶんチューリングコンプリートですよね。しばらく少し考えてみようかと思います。
あまりやる気のない Hello, world!
++++++++++++++++++++++++++++++++0:++++++++++++0:++++++++++++++++++++++++++++0:. +++++++++++++++++++++++++++++0:. +++++++0:. 0:. +++.. 0:. +0:+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++0:++++++++0:+++0:++++++++. 0:. +++. . . .
echo
0+[,0:.+]