[今日のPiet]GridPietGenerator入門編B(命令チートシート2)
どもです。
はてなブログは9/7にメンテをするそうですが、
筆者は昨日メンテを行っていました(何)
1日おいての更新です。
今回は予告通り番外編B、命令チートシートその2です。
以前もチートシート書きましたが、その時にgoto命令と
ラベルの解説が抜けていたので、こちらに載せました。
チートシートその1はこちら:
ymos-hobby-programing.hatenablog.com
命令解説
add命令
概要:加算
書き方:add
入力:なし
スタック変化:あり(2→1)
出力:なし
説明:スタック最上部の2つの値をポップして、最上部にあった値と、その下にあった値を足し算し、結果をスタックにプッシュします。
実行時にスタックに1つ以下の値しかない場合は、実行時エラーとなります。
(この命令は無視されて次の命令が実行されます。)
outc命令
概要:文字出力
書き方:outc
入力:なし
スタック変化:あり(1→0)
出力:文字C
説明:スタック最上部の値Cをポップし、ポップした値を文字コードに持つ文字Cを出力します。
実行時にスタックに値がない場合は、実行時エラーとなります。
(この命令は無視されて次の命令が実行されます。)
roll命令
概要:ロール
書き方:roll
入力:なし
スタック変化:あり(n+2→n)
出力:なし
説明:スタック最上部の2つの値をポップします。
このうち、最上部にあった値をn、最上部から2番目にあった値をcとします。
n、cがポップされた後のスタックに対し、深さnの「ロール操作」をc回繰り返します。
ここで、1回の「ロール操作」とは、
最上部の値を、スタックの上からn番目に移動する操作のことです。
ロール回数cが負の時
の場合は、ロール操作の向きが逆転します。
つまり、スタックの上からn番目の値を、最上部に移動する操作を、
回繰り返すことになります。
深さnが負の時
の場合は、実行時エラーとなります。
(この命令は無視されて次の命令が実行されます。)
深さnが、スタックにある値の数より大きい場合
実行時エラーとなります。(この命令は無視されて次の命令が実行されます。)
深さnが、実装されたスタックの最大長より大きい場合
実行時エラーとなります。(この命令は無視されて次の命令が実行されます。)
inn命令
概要:数値入力
書き方:inn
入力:数値N
スタック変化:あり(0→1)
出力:なし
説明:標準入力から数値を1つ読み取り、入力された値をスタックにプッシュします。
入力が数値として読み込めない場合、実行時エラーとなります。
(この命令は無視されて次の命令が実行されます。)
mod命令
概要:剰余算
書き方:mod
入力:なし
スタック変化:あり(2→1)
出力:なし
説明:スタック最上部の2つの値をポップして、最上部にあった値を、その下にあった値で割って、その余りをスタックにプッシュします。
実行時にスタックに1つ以下の値しかない場合は、実行時エラーとなります。
(この命令は無視されて次の命令が実行されます。)
ゼロ割が発生した場合は、実行時エラーとなります。
(この命令は無視されて次の命令が実行されます。)
div命令
概要:除算
書き方:div
入力:なし
スタック変化:あり(2→1)
出力:なし
説明:スタック最上部の2つの値をポップして、最上部にあった値を、その下にあった値で割って、その商をスタックにプッシュします。
実行時にスタックに1つ以下の値しかない場合は、実行時エラーとなります。
(この命令は無視されて次の命令が実行されます。)
ゼロ割が発生した場合は、実行時エラーとなります。
(この命令は無視されて次の命令が実行されます。)
not命令
概要:否定
書き方:not
入力:なし
スタック変化:あり(1→1)
出力:なし
説明:スタックの最上部の1つの値をポップし、
- ポップした値が0ならば、1をプッシュします。
- ポップした値が0でないならば、0をプッシュします。 1
実行時にスタックに1つも値がない場合は、実行時エラーとなります。
(この命令は無視されて次の命令が実行されます。)
inc命令
概要:文字入力
書き方:inc
入力:文字C
スタック変化:あり(0→1)
出力:なし
説明:標準入力から文字を1つ読み取り、その文字コードをスタックにプッシュします。
gt命令
概要:数値比較
書き方:gt
入力:なし
スタック変化:あり(1→1)
出力:なし
説明:スタックの最上部の2つの値をポップし、
- 最上部にあった値よりも、その下にあった値の方が大きい場合、1をプッシュします。
- 上記以外の場合は、0をプッシュします。
実行時にスタックに1つ以下の値しかない場合は、実行時エラーとなります。
(この命令は無視されて次の命令が実行されます。)
goto命令
概要:無条件ジャンプ
書き方:goto:ラベル
入力:なし
スタック変化:なし
出力:なし
説明:無条件でラベル:ラベル
にジャンプします。
goto命令に続くコロン:
の前後に、半角スペースなどの区切り文字を入れてはいけません。
ラベル
概要:プログラムのジャンプ先
書き方::ラベル名
入力:なし
スタック変化:なし
出力:なし
説明:プログラム(if命令とgoto命令)のジャンプ先を示す目標としてのみ機能します。
ラベルを作るときは、コロン:
に続けて英数字またはアンダースコア_
を並べてください。
コロン:
の後ろの文字列が「ラベル名」です。
ただし、以下のルールがあります。
- ルール1:コロン
:
の後に、半角スペースなどの空白文字を入れてはいけません。 - ルール2:コロン
:
の直後の1文字は必ず英字にしてください。 - ルール3:同じラベルを複数回使ってはいけません。
おわりに
番外編Aと今回の番外編Bで、
処理フローファイルを書くのに必要な情報は全て出てきました。
次回以降どうしようかはちょっと迷っているのですが、
- Pietそのものの解説(処理フローファイルの命令との関係を解説)
- 中級編を作る(関数を作ってみるとか、再帰処理にチャレンジするとか)
- 上級編(「処理フローファイル読めるでしょ?」というスタンスで好き勝手に突っ走る)
- メンテ(何)
のどれかかなと思っています。
まぁ最後の選択肢はお約束のジョークみたいなもんなので、
なんかしら書きますよ。
じゃ、この辺で。
では。