掴んだ物(技術)はちゃんと食べる記録帳

興味を持ったものに対する足跡を残していくために作成しました。勉強しながら書いているので、間違いや短絡もあると思います。ご指摘いただけると喜びます。

Let's PostScript(3) Operand Stackの操作

今日は久しぶりの飲み会でした。送別会だったのですが。そんなわけで、今日は簡単に済ませます。

StackはLIFO(Last In First Out)

Stackは達磨落としのような感じで最後に入れた(Push)Objectが最初に出てきます(Pop)これをLIFOといいます。 実際に、Ghost Scriptでスタックを積むとこのような感じになります。

GS>1 2 3 4 5
GS<5>stack
5
4
3
2
1

これを取り出すとFILOに基づいて、入れた順番の逆順で取り出されます。

GS<5>==
5
GS<4>==
4
GS<3>==
3
GS<2>==
2
GS<1>==
1

OperandStackの操作をするオペレータ

OperandStackはPostScriptのデータの受け渡しの中核を担い、アルゴリズムによって多様な利用が行われます。 そのため、OperandStackにはたくさんのStack操作用のオペレータが用意されています。

popオペレータ

OperandStackの一番上の要素を破棄する。

GS>1 2 3 4 5
GS<5>pop
GS<4>stack
4
3
2
1

exchオペレータ

OperandStackの上位2つのオブジェクトの位置を入れ替える。

GS>1 2 3 4 5
GS<5>exch
GS<5>stack
4
5
3
2
1

dupオペレータ

OperandStackの一番上の要素をコピーする。

GS>1 2 3 4 5
GS<5>dup
GS<6>stack
5
5
4
3
2
1

copyオペレータ

OperandStackからコピー数を受け取り、OperandStackの一番上からコピー数の要素をコピーする。

GS>1 2 3 4 5
GS<5>3
GS<6>copy
GS<8>clear
GS>1 2 3 4 5
GS<5>3 copy
GS<8>stack
5
4
3
5
4
3
2
1

indexオペレータ

OperandStackから任意の位置を受け取り、OperandStackの上から数えた任意の位置※の要素をコピーする。 ※一番上の要素を0とする。

GS>1 2 3 4 5
GS<5>1 index
GS<6>stack
4
5
4
3
2
1

rollオペレータ

OperandStackから要素数と、回転数を受け取り回転させる。

GS>1 2 3 4 5
GS<5>4 1 roll
GS<5>stack
4
3
2
5
1

clearオペレータ

OperandStackのObjectを破棄する。

GS>1 2 3 4 5
GS<5>clear
GS>

countオペレータ

Operand Stackのオブジェクトをカウントし、カウント数を格納する。

GS>1 2 3 4 5
GS<5>count
GS<6>==
5
GS<5>

markオペレータ

mark ObjectをOperandStackにPushする。 markは配列や処理の終了時の不要となったObjectの破棄等、多様な用途で使用することになる。

counttomarkオペレータ

一番上のmarkの上にある要素数をカウントし、カウント数を格納する。

GS>1 2
GS<2>mark
GS<3>3 4 5
GS<6>counttomark
GS<7>==
3
GS<6>

cleartomarkオペレータ

一番上のmarkの上にある要素とmark自身を破棄する。

GS>1 2
GS<2>mark
GS<3>3 4 5
GS<6>cleartomark
GS<2>stack
2
1

次は、条件判断や反復等の制御公文についてみていこうと思います。