[Piet入門編]Piet入門5
どもです。
Piet入門編の続きです。今回は命令について解説します。
本当はあまり書く気がなかったのですが、
pointer命令とswitch命令の解説がされていないことに気づいたので、
もういっそ全部説明してまえ!ということで、解説します。
Pietの命令
では命令について解説します。
Piet命令一覧
まずはPietの命令一覧を示します。
表の各セルには3行記述がありますが、それぞれ次のような意味があります。
凡例
GridPietGeneratorにおける命令名 説明 |
では一覧表です。表の中にリンクを貼ったので、
お好きなところを見てくんなまし。
明るさ変化0 | 明るさ変化1 | 明るさ変化2 | |
---|---|---|---|
色味変化0 | push プッシュ |
pop ポップ |
|
色味変化1 | add 加算 |
sub 減算 |
mul 乗算 |
色味変化2 | div 除算 |
mod 剰余算 |
not 否定 |
色味変化3 | gt 比較 |
- DP変更 |
- CC変更 |
色味変化4 | dup 複製 |
roll ロール |
inn 数値入力 |
色味変化5 | inc 文字入力 |
outn 数値出力 |
outc 文字出力 |
push
概要 | プッシュ |
---|---|
入力 | なし |
スタック変化 | あり(0→1) |
出力 | なし |
説明 | 正整数Nをプッシュします。 Nは、命令実行直前に抜け出した カラーブロックの面積です。 |
実行時エラー | なし |
pop
概要 | ポップ |
---|---|
入力 | なし |
スタック変化 | あり(1→0) |
出力 | なし |
説明 | スタックから値を1つポップします。 |
実行時エラー | スタックに値がない→命令を無視 |
add
概要 | 加算 |
---|---|
入力 | なし |
スタック変化 | あり(2→1) |
出力 | なし |
説明 | スタックから2つの値a、bをポップし、 それらの和a+bの値をプッシュします。 |
実行時エラー | スタック内の値が2つ未満→命令を無視 |
subtract
概要 | 減算 |
---|---|
入力 | なし |
スタック変化 | あり(2→1) |
出力 | なし |
説明 | スタックから2つの値a、bをポップし、 それらの差a-bの値をプッシュします。 |
実行時エラー | スタック内の値が2つ未満→命令を無視 |
multiply
概要 | 乗算 |
---|---|
入力 | なし |
スタック変化 | あり(2→1) |
出力 | なし |
説明 | スタックから2つの値a、bをポップし、 それらの積abの値をプッシュします。 |
実行時エラー | スタック内の値が2つ未満→命令を無視 |
divide
概要 | 除算 |
---|---|
入力 | なし |
スタック変化 | あり(2→1) |
出力 | なし |
説明 | スタックから2つの値a、bをポップし、 それらの商a/bの値(整数)をプッシュします。 |
実行時エラー | スタック内の値が2つ未満→命令を無視 ゼロ除算→命令を無視 |
mod
概要 | 剰余算 |
---|---|
入力 | なし |
スタック変化 | あり(2→1) |
出力 | なし |
説明 | スタックから2つの値a、bをポップし、 それらの剰余a%bの値をプッシュします。 |
実行時エラー | スタック内の値が2つ未満→命令を無視 ゼロ除算→命令を無視 |
補足 | 剰余a%bとは、aをbで割った余りのことです。 なお、aまたはbが負の場合は、 C言語の剰余演算子 % とは挙動が異なります。Pietでは、剰余rを次の式で計算します。 |
not
概要 | 否定 |
---|---|
入力 | なし |
スタック変化 | あり(1→1) |
出力 | なし |
説明 | スタックから1つの値aをポップし、
|
実行時エラー | スタックに値がない→命令を無視 |
greater
概要 | 大小比較 |
---|---|
入力 | なし |
スタック変化 | あり(2→1) |
出力 | なし |
説明 | スタックから2つの値a、bをポップし、
|
実行時エラー | スタック内の値が2つ未満→命令を無視 |
pointer
概要 | DP回転 |
---|---|
入力 | なし |
スタック変化 | あり(1→0) |
出力 | なし |
説明 | スタックから値Nを1つポップし、
N>0の時は、時計回りにN回、DPを回転します。 N<0の時は、反時計回りに|N|回、DPを回転します。 |
実行時エラー | スタックに値がない→命令を無視 |
補足 | 「DPを回転」とは90°回転を指します。 |
switch
概要 | CC反転 |
---|---|
入力 | なし |
スタック変化 | あり(1→0) |
出力 | なし |
説明 | スタックから値Nを1つポップし、 |N|回だけCCを反転します。
|
実行時エラー | スタックに値がない→命令を無視 |
duplicate
概要 | 複製 |
---|---|
入力 | なし |
スタック変化 | あり(1→2) |
出力 | なし |
説明 | スタック最上部の値をコピーしてプッシュします。 |
実行時エラー | スタックに値がない→命令を無視 |
roll
概要 | ロール |
---|---|
入力 | なし |
スタック変化 | あり(n+2→n) |
出力 | なし |
説明 | スタック最上部の2つの値n、cをポップします。 その後、スタックに対し、深さnの「ロール操作」を回繰り返します。 ロール操作の向きは、回数cの正負によって変わります(補足参照) |
補足 | 深さnの「ロール操作」とは次の操作を指します。
|
実行時エラー | スタックに値が2つ未満→命令を無視 深さn<0→命令を無視 スタック内の値の数が深さnより少ない→命令を無視 |
in(number)
概要 | 数値入力 |
---|---|
入力 | あり |
スタック変化 | あり(0→1) |
出力 | なし |
説明 | 標準入力から数値Nを1つ読み取り、スタックにプッシュします。 |
実行時エラー | 標準入力に値がない→命令を無視 入力が数値として読み込めない→命令を無視 |
in(char)
概要 | 文字入力 |
---|---|
入力 | あり |
スタック変化 | あり(0→1) |
出力 | なし |
説明 | 標準入力から文字Cを1つ読み取り、スタックにプッシュします。 |
実行時エラー | 標準入力に値がない→命令を無視 |
out(number)
概要 | 数値出力 |
---|---|
入力 | なし |
スタック変化 | あり(1→0) |
出力 | あり |
説明 | スタック最上部の値Nをポップし、数値として標準出力に出力します。 |
実行時エラー | スタックに値がない→命令を無視 |
out(char)
概要 | 文字出力 |
---|---|
入力 | なし |
スタック変化 | あり(1→0) |
出力 | あり |
説明 | スタック最上部の値Cをポップし、文字として標準出力に出力します。 |
実行時エラー | スタックに値がない→命令を無視 |
おわりに
お疲れ様でした。
いつものマークダウンではなく、htmlでベタがきしたため、
怒涛の14000文字オーバーです。
まとめただけあって、わかりやすくはなりました。
チートシートとしてはいいのではないかと思います。
GridPietGeneratorの命令も、今回と同じフォーマットで、
書き直してみますか。余力があればですが。
とりあえずこれでPietの基本事項は説明し切ったと思います。
伝わっているかどうかはわかりませんが。
次どうしますかね。
説明しないとなあと思っているのは以下の2点です。
前者はインストール方法、使い方などを説明して、ぜひ使っていただきたいのですが、
私が作ったものではないのと、私の環境以外でのインストール方法がわからないので、
どこまで説明できるかが謎です。チャレンジはしてみたいですが。
後者は、しばらく説明しないと思います。
というのも、私自身、世にあるPietエディタを、
私の環境にインストールできていないからです。
私としてももどかしく、ふんぬーとなっているところです。
「ないのなら作ればいいじゃない」と言われそうですが、
すでに作っています。
しかしCUIベースなので使いにくいことこの上なしです。
もうちょっと使いやすくしないと、公開できないかなぁと思っています。
結局、npietの紹介にチャレンジするか、GridPietGenerator中級編に走るか
どっちかですかね。多分ですが。
とにもかくにも、今回はこの辺で。
では。