ぼくのかんがえたさいきょうのDartげんご
あれやこれやに書いたとおりDartには個人的に大いに不満があるけど、不満を言ってばかりじゃしようがない。なので、ちょっと考えてみました。Dartがどういう言語なら自分は満足できたんだろうかと。
その結果がこれです。
DartX
http://github.com/technohippy/DartX/
特徴
IDE起動
$ bin/dartx
プログラミング
画面の左側でカーソルが回転しているので、好きなカーソルの形になったときに任意のキーを押下してください。ポインタがインストラクションを選択します。選択されたインストラクションは画面左上に表示されます。
実行
命令を入力し終わったら Crtl+C を押下してください。それまでに入力した命令を実行します。
サンプル
次の順番でカーソルを選択してください。一つでも入力を間違えると正しく実行されません。最初から入力をやり直す必要があります。なお、フォントによっては¥になっているかもしれませんが\と読み替えてください。
\ \ \ \ / \ \ \ - \ \ - \ \ \ / - - \ \ \ \ - / \ \ \ - - \ \ - \ - / - - \ \ \ \ - \ / \ \ \ - - \ - - \ \ / - - \ \ \ \ - - / \ \ \ - - \ - - \ \ / - - \ \ \ \ - \ \ / \ \ \ - - \ - - - - / - - \ \ \ \ - \ - / \ \ \ - \ - - \ \ / - - \ \ \ \ - - \ / \ \ \ - \ \ \ \ \ / - - \ \ \ \ - - - / \ \ \ - - - \ - - - / - - \ \ \ \ - \ \ \ / \ \ \ - - \ - - - - / - - \ \ \ \ - \ \ - / \ \ \ - - - \ \ - \ / - - \ \ \ \ - \ - \ / \ \ \ - - \ - - \ \ / - - \ \ \ \ - \ - - / \ \ \ - - \ \ - \ \ / - - \ \ \ \ - - \ \ / \ \ \ - \ \ \ \ \ / - - \ \ \ \ - - \ - / \ \ \ - - \ - - - - / - - \ \ \ \ - - - \ / \ \ \ - - \ \ - - \ / - - \ \ \ \ - - - - / \ \ \ - \ \ \ \ \ / - - \ \ \ \ - \ \ \ \ / \ \ \ - - - \ \ - - / - - \ \ \ \ - \ \ \ - / \ \ \ - - - \ \ \ \ / - - \ \ \ \ - \ \ - \ / \ \ \ - - \ \ \ \ - / - - \ \ \ \ - \ \ - - / \ \ \ - - \ \ \ - - / - - \ \ \ \ - \ - \ \ / \ \ \ - - \ \ - \ - / - - \ \ \ \ - \ - \ - / \ \ \ - - - \ \ - - / - - \ \ \ \ - \ - - \ / \ \ \ - \ \ \ \ - / - - \ \ \ \ - \ - - - / \ \ \ \ / - - \ \ \ \ \ / / \ - \ - - - \ - - - \ - - - \ \ - \ \ - - \ - \ \ - \ - - - \ - \ \ \ - - \ \ - \ - / / \ - \ - - \ - - - \ \ - - \ \ - \ - \ - - - \ - - - \ - - \ - - \ \ \ - - \ - \ \ - \ - - \ - - - \ \ - - \ \ - \ - / / / / / \ \ \ - - \ \ \ \ - \ - - \ \ - \ \ \ - - \ \ - \ \ / - \ \ \ / - / / \ \ \ - - - \ - - - \ - - - \ \ - \ \ - - \ - \ \ - \ - - - \ - \ \ \ - - \ \ - \ - / \ / \ - - - \ / \ / - \ \ - - - \ - - - \ - - - \ \ - \ \ - - \ - \ \ - \ - - - \ - \ \ \ - - \ \ - \ - \ - \ - - - - - \ - - \ \ - \ - \ - - \ - - - \ \ - - \ \ - \ \ / - / \ \ \ \ \ - / - \ \ \ / \ / \ - - - \ - - - \ - - - \ \ - \ \ - - \ - \ \ - \ - - - \ - \ \ \ - - \ \ - \ - / / \ \ \ - - - \ - - - \ - - - \ \ - \ \ - - \ - \ \ - \ - - - \ - \ \ \ - - \ \ - \ - \ - \ - - - - - \ - - \ \ - \ - \ - - \ - - - \ \ - - \ \ - \ \ / \ / / \ / / / - / / \ \ \ - - - \ \ - \ \ - - \ \ - \ - \ - - \ \ \ \ - \ - - \ \ - \ \ / \ / \ \ / \ - / - \ - - - \ / \ \ \ \ - \ - \ / - \ \ - / - \ \ - - - \ \ - \ \ - - \ \ - \ - \ - - \ \ \ \ - \ - - \ \ - \ \ \ - \ - - - - - \ - - \ \ - \ - \ - - \ - - - \ \ - - \ \ - \ \ / \ / / \ \ \ - / - \ \ \ / \ / \ - - - \ \ - \ \ - - \ \ - \ - \ - - \ \ \ \ - \ - - \ \ - \ \ / / \ \ \ - - - \ \ - \ \ - - \ \ - \ - \ - - \ \ \ \ - \ - - \ \ - \ \ \ - \ - - - - - \ - - \ \ - \ - \ - - \ - - - \ \ - - \ \ - \ \ / \ / / \ \ \ - / - \ \ \ \ \ \ \ / - - \ / - / / \ \ \ - - \ - - - \ \ - - \ \ - \ - \ - - - \ - - - \ - - \ - - \ \ \ - - \ - \ \ - \ - - \ - - - \ \ - - \ \ - \ - / \ \ \ - \ - \ / \ \ \ - - \ - / - / \ \ - / \ \ / - /
入力完了後に Ctrl+C を入力すると、次のように表示されます。
Hello, world of spaces!
なお、どうしても入力に成功しない方は次のように入力してみてください。上記のプログラムが自動的に実行されます。
$ bin/dartx sample/hworld.dartx
ただし、実行が完了するまで20分弱かかります。ご注意ください。
文法
もしかしたらDartXでHello World以外のプログラムを書いてみたい人がいるかも知れないので、一応どのような文法かを記しておきます。
DartXはスタックベースのプログラミング言語で、連投したダーツが的のどの位置に当たったか、または外れたかのパターンがプログラムとなります。一つの命令はIMP(Instruction Modification Parameter)、コマンド、パラメータの3つ組で表現されます。
IMP | 意味 |
---|---|
[ハズレ] | スタック操作 |
[端に中る][ハズレ] | 整数演算 |
[端に中る][端に中る] | ヒープアクセス |
[中心に中る] | フロー制御 |
[端に中る][中心に中る] | 入出力 |
スタック操作 | IMP: [ハズレ] | ||
---|---|---|---|
コマンド | パラメータ | 意味 | |
[ハズレ] | 数値 | 数値をスタックにプッシュ | |
[中心に中る][ハズレ] | - | スタックトップを複製 | |
[中心に中る][端に中る] | - | スタックの1番目と2番目を交換 | |
[中心に中る][中心に中る] | - | スタックトップを破棄 |
整数演算 | IMP: [端に中る][ハズレ] | ||
---|---|---|---|
コマンド | パラメータ | 意味 | |
[ハズレ][ハズレ] | - | スタックの上から二つを足し算 | |
[ハズレ][端に中る] | - | スタックの上から二つを引き算 | |
[ハズレ][中心に中る] | - | スタックの上から二つを掛け算 | |
[端に中る][ハズレ] | - | スタックの上から二つを割り算 | |
[端に中る][端に中る] | - | スタックの上から二つで剰余 |
ヒープアクセス | IMP: [端に中る][端に中る] | ||
---|---|---|---|
コマンド | パラメータ | 意味 | |
[ハズレ] | - | 値をアドレスに格納 | |
[端に中る] | - | アドレスから値をスタックに |
フロー制御 | IMP: [中心に中る] | ||
---|---|---|---|
コマンド | パラメータ | 意味 | |
[ハズレ][ハズレ] | ラベル | ラベル定義 | |
[ハズレ][端に中る] | ラベル | サブルーチン呼び出し | |
[ハズレ][中心に中る] | ラベル | 無条件ジャンプ | |
[端に中る][ハズレ] | ラベル | スタックトップがゼロならジャンプ | |
[端に中る][端に中る] | ラベル | スタックトップが負ならジャンプ | |
[端に中る][中心に中る] | - | サブルーチン終了 | |
[中心に中る][中心に中る] | - | プログラム終了 |
入出力 | IMP: [端に中る][中心に中る] | |
---|---|---|
コマンド | パラメータ | 意味 |
[ハズレ][ハズレ] | - | スタックトップの文字を出力 |
[ハズレ][端に中る] | - | スタックトップの数値を出力 |
[端に中る][ハズレ] | - | 文字を読み込みアドレスに格納 |
[端に中る][端に中る] | - | 数値を読み込みアドレスに格納 |
数値 | 数値は二進数で表し、[ハズレ] が 0、[端に中る] が 1、[中心に中る] が終端記号 |
---|---|
ラベル | ラベルは [ハズレ] と [端に中る] の列で表現され、[中心に中る] が終端記号 |