[Piet入門編]Piet入門5

どもです。

Piet入門編の続きです。今回は命令について解説します。

本当はあまり書く気がなかったのですが、

pointer命令とswitch命令の解説がされていないことに気づいたので、

もういっそ全部説明してまえ!ということで、解説します。

Pietの命令

では命令について解説します。

Piet命令一覧

まずはPietの命令一覧を示します。

表の各セルには3行記述がありますが、それぞれ次のような意味があります。

凡例

命令名(公式)
GridPietGeneratorにおける命令名
説明

では一覧表です。表の中にリンクを貼ったので、

お好きなところを見てくんなまし。

明るさ変化0 明るさ変化1 明るさ変化2
色味変化0
push
push
プッシュ
pop
pop
ポップ
色味変化1
add
add
加算
subtract
sub
減算
multiply
mul
乗算
色味変化2
divide
div
除算
mod
mod
剰余算
not
not
否定
色味変化3
greater
gt
比較
pointer
-
DP変更
switch
-
CC変更
色味変化4
duplicate
dup
複製
roll
roll
ロール
in(number)
inn
数値入力
色味変化5
in(char)
inc
文字入力
out(number)
outn
数値出力
out(char)
outc
文字出力

push

概要プッシュ
入力なし
スタック変化あり(0→1)
f:id:y-mos:20210818230054p:plainf:id:y-mos:20210818230132p:plain
出力なし
説明正整数Nをプッシュします。
Nは、命令実行直前に抜け出した
カラーブロックの面積です。
実行時エラーなし

pop

概要ポップ
入力なし
スタック変化あり(1→0)
f:id:y-mos:20210818230132p:plainf:id:y-mos:20210818230054p:plain
出力なし
説明スタックから値を1つポップします。
実行時エラースタックに値がない→命令を無視

add

概要加算
入力なし
スタック変化あり(2→1)
f:id:y-mos:20210827223901p:plainf:id:y-mos:20210827223909p:plain
出力なし
説明スタックから2つの値a、bをポップし、
それらの和a+bの値をプッシュします。
実行時エラースタック内の値が2つ未満→命令を無視

subtract

概要減算
入力なし
スタック変化あり(2→1)
f:id:y-mos:20210818230721p:plainf:id:y-mos:20210818220402p:plain
出力なし
説明スタックから2つの値a、bをポップし、
それらの差a-bの値をプッシュします。
実行時エラースタック内の値が2つ未満→命令を無視

multiply

概要乗算
入力なし
スタック変化あり(2→1)
f:id:y-mos:20210818230721p:plainf:id:y-mos:20210818230728p:plain
出力なし
説明スタックから2つの値a、bをポップし、
それらの積a\timesbの値をプッシュします。
実行時エラースタック内の値が2つ未満→命令を無視

divide

概要除算
入力なし
スタック変化あり(2→1)
f:id:y-mos:20210824001707p:plainf:id:y-mos:20210824003536p:plain
出力なし
説明スタックから2つの値a、bをポップし、
それらの商a/bの値(整数)をプッシュします。
実行時エラースタック内の値が2つ未満→命令を無視
ゼロ除算→命令を無視

mod

概要剰余算
入力なし
スタック変化あり(2→1)
f:id:y-mos:20210824001707p:plainf:id:y-mos:20210824002018p:plain
出力なし
説明スタックから2つの値a、bをポップし、
それらの剰余a%bの値をプッシュします。
実行時エラースタック内の値が2つ未満→命令を無視
ゼロ除算→命令を無視
補足剰余a%bとは、aをbで割った余りのことです。
なお、aまたはbが負の場合は、
C言語剰余演算子%とは挙動が異なります。
Pietでは、剰余rを次の式で計算します。
r=a-b\left\lfloor\frac{a}{b}\right\rfloor

not

概要否定
入力なし
スタック変化あり(1→1)
f:id:y-mos:20210827224411p:plainf:id:y-mos:20210827224339p:plain
出力なし
説明スタックから1つの値aをポップし、
  • a=0ならば、1をプッシュします。
  • a=0でないならば、0をプッシュします。
実行時エラースタックに値がない→命令を無視

greater

概要大小比較
入力なし
スタック変化あり(2→1)
f:id:y-mos:20210827223901p:plainf:id:y-mos:20210827224635p:plain
出力なし
説明スタックから2つの値a、bをポップし、
  • a>bならば、1をプッシュします。
  • a>bでないならば、0をプッシュします。
実行時エラースタック内の値が2つ未満→命令を無視

pointer

概要DP回転
入力なし
スタック変化あり(1→0)
f:id:y-mos:20210904171459p:plainf:id:y-mos:20210818230054p:plain
出力なし
説明スタックから値Nを1つポップし、
N>0の時は、時計回りにN回、DPを回転します。
N<0の時は、反時計回りに|N|回、DPを回転します。
f:id:y-mos:20210904174217p:plainf:id:y-mos:20210904174229p:plain
pointer(N=1のとき)

f:id:y-mos:20210904174217p:plainf:id:y-mos:20210904174222p:plain
pointer(N=-1のとき)
実行時エラースタックに値がない→命令を無視
補足「DPを回転」とは90°回転を指します。

switch

概要CC反転
入力なし
スタック変化あり(1→0)
f:id:y-mos:20210904171459p:plainf:id:y-mos:20210818230054p:plain
出力なし
説明スタックから値Nを1つポップし、 |N|回だけCCを反転します。
f:id:y-mos:20210904174217p:plainf:id:y-mos:20210904174556p:plain
switch命令(|N|が奇数のとき)
実行時エラースタックに値がない→命令を無視

duplicate

概要複製
入力なし
スタック変化あり(1→2)
f:id:y-mos:20210818230353p:plainf:id:y-mos:20210818230335p:plain
出力なし
説明スタック最上部の値をコピーしてプッシュします。
実行時エラースタックに値がない→命令を無視

roll

概要ロール
入力なし
スタック変化あり(n+2→n)
f:id:y-mos:20210822051653p:plainf:id:y-mos:20210822051706p:plain
roll (c>0)
出力なし
説明スタック最上部の2つの値n、cをポップします。
その後、スタックに対し、深さnの「ロール操作」を|c|回繰り返します。 ロール操作の向きは、回数cの正負によって変わります(補足参照)
補足深さnの「ロール操作」とは次の操作を指します。
  • 回数c>0の時:最上部の値を深さnの位置に移動させる
    f:id:y-mos:20210827225344p:plainf:id:y-mos:20210827225353p:plain
  • 回数c<0の時:深さnの位置にある値を最上部に移動させる
    f:id:y-mos:20210827225359p:plainf:id:y-mos:20210827225404p:plain
実行時エラースタックに値が2つ未満→命令を無視
深さn<0→命令を無視
スタック内の値の数が深さnより少ない→命令を無視

in(number)

概要数値入力
入力あり
スタック変化あり(0→1)
f:id:y-mos:20210827224052p:plainf:id:y-mos:20210827224210p:plain
出力なし
説明標準入力から数値Nを1つ読み取り、スタックにプッシュします。
実行時エラー標準入力に値がない→命令を無視
入力が数値として読み込めない→命令を無視

in(char)

概要文字入力
入力あり
スタック変化あり(0→1)
f:id:y-mos:20210827224052p:plainf:id:y-mos:20210827224554p:plain
出力なし
説明標準入力から文字Cを1つ読み取り、スタックにプッシュします。
実行時エラー標準入力に値がない→命令を無視

out(number)

概要数値出力
入力なし
スタック変化あり(1→0)
f:id:y-mos:20210904171459p:plainf:id:y-mos:20210818230054p:plain
出力あり
説明スタック最上部の値Nをポップし、数値として標準出力に出力します。
実行時エラースタックに値がない→命令を無視

out(char)

概要文字出力
入力なし
スタック変化あり(1→0)
f:id:y-mos:20210827224048p:plainf:id:y-mos:20210827224052p:plain
出力あり
説明スタック最上部の値Cをポップし、文字として標準出力に出力します。
実行時エラースタックに値がない→命令を無視

おわりに

お疲れ様でした。

いつものマークダウンではなく、htmlでベタがきしたため、

怒涛の14000文字オーバーです。

まとめただけあって、わかりやすくはなりました。

チートシートとしてはいいのではないかと思います。

 

GridPietGeneratorの命令も、今回と同じフォーマットで、

書き直してみますか。余力があればですが。

 

とりあえずこれでPietの基本事項は説明し切ったと思います。

伝わっているかどうかはわかりませんが。

 

次どうしますかね。

説明しないとなあと思っているのは以下の2点です。

前者はインストール方法、使い方などを説明して、ぜひ使っていただきたいのですが、

私が作ったものではないのと、私の環境以外でのインストール方法がわからないので、

どこまで説明できるかが謎です。チャレンジはしてみたいですが。

 

後者は、しばらく説明しないと思います。

というのも、私自身、世にあるPietエディタを、

私の環境にインストールできていないからです。

私としてももどかしく、ふんぬーとなっているところです。

 

「ないのなら作ればいいじゃない」と言われそうですが、

すでに作っています。

しかしCUIベースなので使いにくいことこの上なしです。

もうちょっと使いやすくしないと、公開できないかなぁと思っています。

 

結局、npietの紹介にチャレンジするか、GridPietGenerator中級編に走るか

どっちかですかね。多分ですが。

 

とにもかくにも、今回はこの辺で。

では。