コマンドライン引数

以前から PostScript scriptコマンドライン引数を利用できないかと思っていたのだけど、Ghostscript でコマンドライン引数を利用する方法がわかったのでメモ。
PostScript ファイルを指定して Ghostscript を起動する時に gs -- ファイル名 arg1 arg2 ... という形式で起動すると、ARGUMENTS という変数に引数文字列の配列 [(arg1) (arg2) ... ] が代入される。(gs ファイル名 という形だと ARGUMENTS は定義されないので、利用しようとしてもエラーになる)。また shellarguments という、ARGUMENTS が定義されている場合は ARGUMENTS の配列の中身 (つまり引数の文字列) と true をスタックに積み、されていない場合は false を積むという手続きが gs_init.ps で定義されている。
例えば、コマンドライン引数に 2 個の数字を渡すと最大公約数を計算するプログラムは以下のように書ける。(エラーチェックは省略)

#!/bin/sh
exec gs -q -dNODISPLAY shell.ps -- $0 "$@"
ARGUMENTS{cvi}forall
{dup 3 1 roll mod dup 0 eq{exit}if}loop
pop =
quit

shell.ps はこんなの。

%!PS
0 dict begin
/#! mark def
/gs {} def
/-q {} def
/-dNODISPLAY {} def
/shell.ps {} def
/-- {} def
/$0 {} def
/"$@" {cleartomark end} def