PostScript golf のために
以下の技は code golf 限定です。エディタで普通に PostScript 画像を書くときや、PostScript インタープリタを使ったスクリプトを書く時などに使ってはいけません。
PostScript で、スタック以外の場所に値を保存しておきたい場合、通常は
/x 42 def % 42 を x に代入 /x exch def % スタックのトップにあるものを x に代入
のようにする。これをバイナリ化すると、前者は '/' と変数名、def をバイナリ化した \x92\x33 (16進表記) で 4 byte、後者はさらに exch をバイナリ化した \x92\3e が加わり 6 byte 使用することになる。
しかし、setlinecap や setlinewidth、moveto、setrgbcolor、setdash 等を使えば、バイナリ化後に 2 byte で済ませることができるのである。
具体的には、
1.4 setlinewidth
として、1.4 を「線の太さ」に代入しておき、値が必要になったら
currentlinewidth
で取り出すという寸法である。
値を代入する手続き、取り出す手続き、保存できる値の型を表にすると、以下の様になる。
代入 | 取り出し | 型 |
setlinecap | currentlinecap | 0,1,2 |
setlinewidth | currentlinewidth | 非負の実数 |
moveto | currentpoint | 実数 2 個の組 |
setrgbcolor | currentrgbcolor | 0 から 1 の実数 3 個の組 |
setdash | currentdash | 非負の整数または実数の配列と実数の組 |
moveto に関しては、rmoveto を使って 2 成分ベクトルの足し算ができるというオマケもついてきて、お得である。
a b moveto % 代入 % 色々な処理 c d rmoveto % 足し算 currentpoint % スタックに a+c と b+d を積む
という事を考えたが、実際使える場面は少ないと思う。一番よく使うであろう整数が setlinecap では 0,1,2 しか保存できないし、配列をだけを保存したいとき setdash では余計な実数がくっついてくるし、rmoveto を使った足し算は、精度が低い。
GS>0.1 2.3 moveto GS>4.5 -6.7 rmoveto GS>currentpoint GS>== -4.40014648 GS>== 4.59985352