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
次は、条件判断や反復等の制御公文についてみていこうと思います。