Trefungeエディタは、プログラミング言語Trefungeの開発環境です。
Trefungeは、1998年に作られたいわゆる難解プログラミング言語の1つです。
Funge-98と言われる一連の言語のうちの一つであり、Trefungeとはそのうち3次元のものを示します。
記号1つにつき1つの命令を表し、記号は一列に並んでいるのではなく、三次元的に並んでいます。
すなわち、プログラムは記号の命令を1つずつ実行していくわけですが、実行する向きは上下左右に加えて手前・奥の全六方向に変更でき、3次元空間上を動き回ります。
また、大きな特徴として、自己変更的であるという点があります。後述のg命令やp命令は、プログラムのテキスト自体を参照したり変更したりします。ただし、ファイルそのものが変更されるわけではなく、あくまで実行中のみです。
Trefungeには、符号付き32ビット整数のスタックがあります。変数はありません。スタックとは、値を順番に積んだり(追加したり)取り出したりできるというものです。値をスタックの一番上に積むことをプッシュといい、一番上を取り出すことをポップといいます。
例えば、空のスタックに2・3・5を順番に積むと、スタックは
2 3 5
という状態になります。ここでポップすると、スタックは
2 3
になります。
また、ファイルの上下・左右・手前と奥はそれぞれループしています。したがって、プログラム空間の左端からさらに左へ行くと右端へ行くなどします。ファイルが空の状態で実行すると無限ループとなってしまうので、注意しましょう。
実行の最初の位置は左上(0, 0, 0)で、向きは右(1, 0, 0)になっています。
ここでは、メジャーな命令のみ紹介しています。より詳細な情報を得るには、http://quadium.net/funge/spec98.htmlを参照して下さい。このマニュアルに載っていない命令でもサポートしているものがあります。
記号 | 動作 |
---|---|
実行の向き | |
< | 実行の向きを左(-1, 0, 0)にする。 |
^ | 実行の向きを上(0, -1, 0)にする。 |
> | 実行の向きを右(1, 0, 0)にする。 |
v | 実行の向きを下(0, 1, 0)にする。 |
l | 実行の向きを手前(0, 0, -1)にする。 |
h | 実行の向きを奥(0, 0, 1)にする。 |
] | 実行の向きを90度右に回転する。Z軸中心(Z軸方向に影響はない)。 |
[ | 実行の向きを90度左に回転する。Z軸中心(Z軸方向に影響はない)。 |
r | 実行の向きを逆にする。 |
x | スタックからz,y,xを順にポップし、実行の向きを(x, y, z)にする。 |
? | 実行の向きを6方向のどれかにランダムに変更する。 |
条件分岐 | |
! | スタックをポップして、その値が0なら1をプッシュ、0でないなら0をプッシュする(論理否定)。 |
` | スタックからb,aをポップして、a>bならば1、そうでないならば0をプッシュする。 |
_ | スタックをポップして、その値が0なら実行の向きを右に、0以外なら左にする。 |
| | スタックをポップして、その値が0なら実行の向きを下に、0以外なら上にする。 |
m | スタックをポップして、その値が0なら実行の向きを手前に、0以外なら奥にする。 |
w | スタックからb,aをポップして、a<bならば[と同様に90度左に回転、a>bならば]と同様に90度右に回転、a=bならば何もせずに直進する。 |
その他のプログラムフロー | |
# | 次の文字の命令を実行しない。 |
; | 次に";"が出現するまでの文字列を無視する(コメント)。 |
@ | 現在の実行ポインタを終了する(後述)。全てのポインタがなくなると実行を終了する。 |
q | 実行を終了する。 |
j | スタックをポップして、その数だけ実行位置を先にジャンプする。1ならば、1個とばすので#と同じ。負の数を指定すると逆に飛ぶ。 |
k | スタックをポップして、その数だけ次の命令を繰り返して実行する。 |
算術 | |
0~9 | その数値をスタックにプッシュする。a~fは10から15。 |
a~f | |
+ | スタックからb,aを順にポップし、a+bの値をプッシュする。 |
- | スタックからb,aを順にポップし、a-bの値をプッシュする。 |
* | スタックからb,aを順にポップし、a*bの値をプッシュする。 |
/ | スタックからb,aを順にポップし、a/bの値をプッシュする。 |
% | スタックからb,aを順にポップし、aをbで割ったあまりをプッシュする。 |
文字列 | |
" | 次の"までを文字列とみなし、ASCIIコードを順にスタックにプッシュする。 |
' | プログラムで次に現れた文字(スペースなどでもよい)を読み込み、そのASCIIコードをプッシュする。その文字は#のようにとばす。 |
s | スタックをポップして、プログラムの次の位置をそれに書き換える('の逆)。その位置はとばす。 |
スタック操作 | |
$ | スタックをポップする(その値は使用しない)。 |
: | スタックをポップして、その値を2回プッシュする。 |
\ | スタックから2つポップして、順を逆にして2つをプッシュする。 |
n | スタックを全て消去する。 |
プログラム書き換え | |
g | スタックかz,y,xを順にポップして、プログラムの(x,y,z)の位置の文字のASCIIコードをスタックにプッシュする。ただしプログラムの左上は(0,0,0)です。 |
p | スタックからz,y,x,aを順にポップして、プログラムの(x,y,z)の位置の文字のASCIIコードをaに置き換える。 |
入出力 | |
, | スタックをポップして、それをASCIIコードとみなして1文字出力する。 |
. | スタックをポップして、その値を出力し、さらに半角スペースを出力する。 |
~ | 1文字入力させ、そのASCIIコードをスタックにプッシュする。 |
& | 数値を入力させ、その値をスタックにプッシュする。 |
入出力 | |
, | スタックをポップして、それをASCIIコードとみなして1文字出力する。 |
. | スタックをポップして、その値を出力し、さらに半角スペースを出力する。 |
~ | 1文字入力させ、そのASCIIコードをスタックにプッシュする。 |
& | 数値を入力させ、その値をスタックにプッシュする。 |
マルチスレッド | |
t | 現在の実行ポインタを複製する。ただし、そのうち1つは実行の向きが逆になる。スタックも複製される。 |
開いているプログラム中の文字は赤色の枠で表示されています。
カーソルは黄色の枠で示され、カーソルキー・PageUp/PageDownキーで移動させることができます。
PageUpは手前、PageDownは奥方向に移動しますが、X軸・Y軸・Z軸のどれであるかは現在の表示モードによって変わります。
< ^ > v l hの6つの文字は、プログラムの実行の向きを変更する命令です。これらを分かりやすくするため、これらの文字はその文字を表示する代わりに矢印で示されます。画面の上下左右へ向かうものは上下左右の矢印で、手前に向かうものは「・」で、奥へ向かうものは「×」で示します。これらは、同じ文字でも、平面モードによって画面上の表示と対応するように変化します。
F11キーを押すと、この矢印表示を用いるか、文字をそのまま表示するかを切り替えることができます。
通常のテキストエディタと同様に、キーボードから入力できます。ただし、半角文字しか入力できません。入力すると、カーソルは次に移ります。このとき移動する方向は、カーソルキーで移動したり「<」「^」「>」「v」「l」「h」を入力するとその方向に変わります。
入力した文字の削除は、半角スペースで上書きするか、Backspace(1つ戻って削除)・Delete(その場で削除)を使用します。
また、Insertキーを押しながらカーソルキー・PageUp/PageDownキーを押すと、コードをその向きへ向かって一つずらします。
また、Ctrlキーを押しながらカーソルキー・PageUp/PageDownキーを押すと、その方向へ実行方向を変更する文字(< ^ > v l h)を入力します。XY,XZ,YZのどの平面であるかにかかわらず、画面表示に応じた方向を指定することができます。
画面を右クリックしてそのままドラッグすると、視点変更することができます。
「ファイル」メニューから、「新規作成」「開く」「上書き保存」「名前を付けて保存」ができます。
また、ウィンドウにファイルをドラッグ&ドロップすることでもファイルを開くことができます。
ファイル形式はテキストファイルで、テキストファイルの「.txt」と、Trefungeの「.t98」が用意されています。中身は全く同じです。
3次元の領域をテキストファイルとして表す方法は、改行(0x0A)でy座標がひとつ進み、改ページ(0x0C)でz座標がひとつ進みます。
実行に関するコマンドは、「実行」「ステップ実行」「停止」の3種類があります。
普通に現在開いているコードを実行します。F5キーでも実行することができます。
実行時には、下の部分に出力表示領域、右のほうに現在のスタックの状態(ステップ実行時)表示領域が出現します。
一命令ずつ実行する方法です。Enterキーを押すと次に進みます。この状態で「実行」すると、続きから通常の実行を行ないます。
ステップ実行を中止したり、また、実行すると出てくる出力欄などを消去します。
メニューの「実行」で、次のオプションが設定できます。
ソフトの本体です。このファイルを起動すると、ソフトが起動します。
このファイルです。
Trefungeプログラミングのコツなどを書いてあります。
Trefungeのコードのサンプルがいくつか入っています。
d3module