どもです。
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をポップし、 それらの積a |
| 実行時エラー | スタック内の値が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の「ロール操作」を |
| 補足 | 深さ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中級編に走るか
どっちかですかね。多分ですが。
とにもかくにも、今回はこの辺で。
では。





























