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