【基本-14】グローバル変数とローカル変数について

PostScriptではローカル変数という明確なものはありませんが、辞書機能を利用して変数の有効範囲をシミュレートすることは可能です。
辞書とはキーと値をペアにしたデータの入れ物です。
PostScriptでは
●ユーザー辞書は読み書き可能なローカル辞書で辞書スタックの一番上にあり、カレント辞書となります。
●グローバル辞書は書き込み可能なグローバルな辞書
●システム辞書は読み取り専用のグローバルな辞書でオペレータ名とその値(動作)や定数が格納されています。
この講座ではほとんどグローバル変数しか使用していません。それは短いプログラムなので、ローカル変数を使う必要性を感じていなかったからです。
正しく動作するプログラムを組む時には変数の管理が必要ですので、ローカル変数の指定方法をご紹介します。

(1)辞書に入れる要素数を指定して辞書を作成します。
例:( /xxx 1 dict def ) または ( 3 dict )
(2)辞書を辞書スタックにプッシュします。(begin)
(3)要素を要素数分、定義します。例(/yy 100 def)
(4)辞書をポップします。(end)
以上で辞書をローカル変数として使用することができます。
要素数は指定した値より多くなっても問題ありません。
Postscript言語レベル2以上では要素数を初期値と解釈して動的に拡張してくれます。

次のtest01はグローバル変数とローカル変数で結果の値が違っています。


1
2
3
4
5
6
7
8
9
10
11
12
%!PS-Adobe-3.0 EPSF-3.0
%%BoundingBox: 0 0 240 240
%%Title:グローバル変数とローカル変数
%上記イメージとコードは関係ありません。

/test01 0 def % test01に0を入れる(グローバル変数)
/testdict 1 dict def % 要素数1のtestdictという名前の辞書を作成
testdict begin % testdictを辞書スタックにプッシュ
    /test01 100 def % test01に100を入れる(ローカル変数)
    test01 == % test01を標準出力 結果:100
end %カレント辞書(testdict)をポップする
test01 == % test01を標準出力 結果:0

Distillefで開くとジョブログ画面に標準出力の結果が表示されます。


またはMacのプレビュー.appで開くとエラーとなりますが、コンソールで標準出力の結果を
見ることができます。

次はプロシージャ内で名前のない辞書を作成する例です。
呼び出される毎にメモリを消費するが、変数が毎回初期化されるということと、
名前がないので隠蔽できるメリットがあります。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
%!PS-Adobe-3.0 EPSF-3.0
%%BoundingBox: 0 0 240 240
%%Title:グローバル変数とローカル変数

/test01 0 def % test01に0を入れる(グローバル変数)
/test02 2 def % test02に2を入れる(グローバル変数)

/testproc {
    2 dict  begin  % 要素数2の辞書を辞書スタックにプッシュ
        /test01 100 def % test01に100を入れる(ローカル変数)
        /test02 50 def %  test02に50を入れる(ローカル変数)
        test01 == % test01を標準出力
        test02 == % test02を標準出力
    end %カレント辞書(testdict)をポップする
} def
test01 == % test01を標準出力 結果:0
/test01 test02 3 add def % test02に3を足したものをtest01に入れる
test01 == % test01を標準出力 結果:5
test02 == % test01を標準出力 結果:2
testproc  % 標準出力 結果:100  50

(例)/testdict 2 dict def
名前のない辞書を作成することも可能
(例)1 dict begin

【オペレータの説明】

/キー 値 defキーと値のペアを辞書に登録します。これは他のプログラムの変数のように使用できます。 /キー { 処理 } def のようにすればプロシージャとなります。プロシージャとは複数の処理をまとめたものです。
整数 dict整数個(0以上)の要素を持つ空の辞書を作成してオペランドスタックに返す。
辞書 begin辞書を辞書スタックにプッシュし、カレント辞書に設定する。
(例)testdict begin
endカレント辞書を辞書スタックからポップし、その下の辞書をカレント辞書に設定する。
/キー load辞書スタックでキーを検索し、対応する値を返す。
辞書 /キー getキーに対応する辞書の値を返す。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次