printf("Hello World");というように「命令→その対象」といったような順番で記述されますが, Postscriptでは
(Hello World!) showというように「対象→命令」といった順番で書かれます.このような記法の場合 スタックというものを使うと効率的に処理でき,Postscriptもスタックを使って います.
200 100 /Msakaといった具合に積み重ねられ,さらに"300 (takeshi)"というオペランドの記述 を追加すると,オペランドスタックは
(takeshi) 300 200 100 /Msakaというような状態になります.そしてオペレータ(実行可能なオブジェクト) はこのスタックの上から順にオペランドを取得していきます. たとえば,このようなオペランドスタックの状態のとき,"show"オペレータを 実行すると,"show"はオペランドスタックの一番上の"(takeshi)"を引っ張り出して その文字列を紙に描くので,オペランドスタックは次のような状態になります.
300 200 100 /Msaka
Aladdin Ghostscript 5.10 (1997-11-23) Copyright (C) 1997 Aladdin Enterprises,..<略> This software comes with NO WARRANTY: ..<略> Loading Kanji fonts... done. Loading NimbusRomNo9L-Regu font from ..<略> done. Loading NimbusSanL-Regu font from ..<略> done. GS>と表示されて,"GS>"といったプロンプトが表示されます. 今回は文字列を作画したいので,まず始めに、
GS>/Helvetica findfont 60 scalefont setfont GS>100 100 movetoと入力して下さい.(今は怪しいおまじないと思ってください) 次にオペランドを入力します.
GS>/Msaka 100 200 GS<3>すると,プロンプトに現在,オペランドスタックに積まれている オペランドの数が表示されます.次に,オペランドスタックの中身を 確認してみます."pstack"というオペレータはオペランドスタックの中身を 上から順にすべてを標準出力に吐き出します.(作画はしない)この時, オペランドスタックの中身は保持されます.
GS<3>pstack 200 100 /Msaka GS<3>そして,オペランドを追加して,また中身を確認すると,
GS<3>300 (takeshi) GS<5>pstack (takeshi) 300 200 100 /Msaka GS<5>最後に,"show"でオペランドスタックの一番上を作画し,中身を確認すると
GS<5>show GS<4>pstack 300 200 100 /Msaka GS<4>のように,オペランドスタックの一番上の"(takeshi)"が取り除かれ, "takeshi"という文字列が作画されます.終了する時は,
GS<4>quitです.
100 100 moveto (Hello World!) showと記述しました."moveto"はオペランドスタックの1番上をy座標,その次をx座標 として引っ張り出して,その座標にペンを移動するオペレータです. 先ほどのスタックの概念によれば,この記述を
(Hello World!) 100 100 moveto showと記述しても同じ結果になります.(よく考えれば分かるはずです)
GS<2>pstack 200 100 GS<2>add pstack 300 GS<1>
GS<2>pstack 200 100 GS<2>sub pstack -100 GS<1>
GS<2>pstack 200 100 GS<2>mul pstack 20000 GS<1>
GS<2>pstack 200 100 GS<2>div pstack 0.5 GS<1>
GS<2>pstack 200 100 GS<2>dup pstack 200 200 100 GS<3>
GS<2>pstack 200 100 GS<2>pop pstack 100 GS<1>
GS<2>pstack 200 100 GS<2>exch pstack 100 200 GS<2>
GS<5>pstack 2 400 300 200 100 GS<5>copy pstack 400 300 400 300 200 100 GS<6>
GS<5>pstack 2 400 300 200 100 GS<5>index pstack 200 400 300 200 100 GS<5>
GS<6>pstack 1 3 400 300 200 100 GS<6>roll pstack %上から3個のオブジェクトを1回転する 300 200 400 100 GS<4>3 2 roll pstack %上から3個のオブジェクトを2回転する 400 300 200 100 GS<4> %結局元に戻る(3個3回転)