この言語で認められるトークンは、「すごい!」「カラデシュ!」「本当にすごいんだ!」のいずれかのみです。それ以外の文字(改行なども含む)はコメント扱いとなり、実行結果には何の影響も及ぼしません。
この言語では、以下に示すコマンドの羅列を一つずつ実行していく形態をとります。コマンドを書くには、まずそのコマンドに対応したIMP(Instruction Modification Parameter)を記述し、その後にコマンドを記述してください。
例えば、Dupコマンドの記述: すごい!本当にすごいんだ!すごい!
また、実行時にはスタック、及びヒープ領域が空の状態で用意されます。これを元にして処理を実行します。
但し、この言語は整数しか扱うことが出来ず、従ってスタックやヒープに積むことができるのも整数のみです。
いくつかのコマンドは引数を要求します。引数はコマンドに続けて記述しなければなりません。引数には<数値><ラベル>の2種類が存在します。
<数値>引数は、2進数で記述されます。最初に符号が記述されます([すごい!]=正,[カラデシュ!]=負)。その次からは、[すごい!]と[カラデシュ!]を並べます。この時、[すごい!]はその桁が0ビットであることを表し、[カラデシュ!]は1であることを表します。最後に、[本当にすごいんだ!]を記述して終了しなければなりません。
例えば、-5: カラデシュ!カラデシュ!すごい!カラデシュ!本当にすごいんだ!
<ラベル>引数は、単に[すごい!]と[カラデシュ!]の羅列です。最後に、[本当にすごいんだ!]を記述して終了しなければなりません。
例えば: すごい!カラデシュ!すごい!カラデシュ!本当にすごいんだ! など
Labelコマンドで宣言するラベルはそれぞれ異なる列でなければなりません。また、Labelコマンド以外のコマンドで存在しないラベルを指定した場合にはコンパイルエラーとなります。
スタックを操作するコマンド群です。ここでは、スタックの要素は最も後に積まれた要素から順番に番号付けされているものとして定義します。
名前 | コマンド | 引数 | 説明 |
---|---|---|---|
Push | [すごい!] | <数値> | <数値>をスタックに積みます。 |
Dup | [本当にすごいんだ!][すごい!] | - | スタックの1番目の要素を複製します。 |
Copy | [カラデシュ!][すごい!] | <数値> | スタックの、<数値>番目の要素を複製しスタックに積みます。 |
Swap | [本当にすごいんだ!][カラデシュ!] | - | スタックの1番目の要素と2番目の要素を入れ替えます。 |
Discard | [本当にすごいんだ!][本当にすごいんだ!] | - | スタックの1番目の要素を捨てます。 |
Slide | [カラデシュ!][本当にすごいんだ!] | <数値> | スタックの、<数値>番目の要素を捨てます。 |
数値の計算をするコマンド群です。スタックの2番目に積んだ要素が演算子の左に、1番目に積んだ要素が演算子の右にあるものとして計算します。例えば、[a, b]の順に数値をスタックに積んだ後、Subtractコマンドを実行するとスタックに a - b の値が積まれます。
名前 | コマンド | 引数 | 説明 |
---|---|---|---|
Add | [すごい!][すごい!] | - | 加算 |
Subtract | [すごい!][カラデシュ!] | - | 減算 |
Multiply | [カラデシュ!][本当にすごいんだ!] | - | 乗算 |
Divide | [カラデシュ!][すごい!] | - | 整数での除算 |
Modulo | [カラデシュ!][カラデシュ!] | - | 剰余 |
KaladeshArithmetic | [本当にすごいんだ!] | - | コンピューターが耐えきれない位に本当にすごい演算 |
ヒープを操作するためのコマンド群です。Storeコマンドを使用するためには、[ヒープのキーとなる数値、ヒープに積みたい値] の順に数値をスタックに積み、Storeコマンドを呼び出します。Retrieveコマンドを使用するためには、ヒープのキーとなる数値をスタックに積み、Retrieveコマンドを呼び出します。
名前 | コマンド | 引数 | 説明 |
---|---|---|---|
Store | [すごい!] | - | 指定したデータをヒープの指定した位置に格納します。 |
Retrieve | [カラデシュ!] | - | ヒープの指定した位置から数値を読み込みスタックに積みます。 |
制御フローに関するコマンド群です。Labelコマンドのみコンパイル時に処理されます。(Labelコマンドより先にCallやJumpコマンドを使用することができます。)
名前 | コマンド | 引数 | 説明 |
---|---|---|---|
Label | [すごい!][すごい!] | <ラベル> | この位置を <ラベル>としてマークします。 |
Call | [すごい!][カラデシュ!] | <ラベル> | <ラベル> をサブルーチンとして呼び出します。(Return と組み合わせて使用します。) |
Jump | [すごい!][本当にすごいんだ!] | - | <ラベル> の位置に実行を移します。 |
JumpIfZero | [カラデシュ!][すごい!] | <ラベル> | スタックから要素を1つ取り出し、それが0であるなら<ラベル> の位置に実行を移します。 |
JumpIfNegative | [カラデシュ!][カラデシュ!] | <ラベル> | スタックから要素を1つ取り出し、それが負の値であるなら<ラベル> の位置に実行を移します。 |
Return | [カラデシュ!][本当にすごいんだ!] | - | 現在のサブルーチンを終了し、呼び出し元に制御を戻します。(Call と組み合わせて使用します。) |
End | [本当にすごいんだ!][本当にすごいんだ!] | - | プログラムの実行を即座に終了します。 |
入出力に関するコマンド群です。
名前 | コマンド | 引数 | 説明 |
---|---|---|---|
OutputCharacter | [すごい!][すごい!] | - | スタックから要素を1つ文字コードとして取り出し、その文字を表示します。 |
OutputNumber | [すごい!][カラデシュ!] | - | スタックから要素を1つ取り出し、それを数値として表示します。 |
InputCharacter | [カラデシュ!][すごい!] | - | 未実装。 |
InputNumber | [カラデシュ!][カラデシュ!] | - | 未実装。 |