ボンジュール・マドモアゼル

本サイトの情報は自己責任にてご利用下さい。

[C++] #define private public

 
■[c/c++]#define private public

というのを見かけて、ちょちょちょ!!

と思った。
神様なんて信じない僕らのために

[PostScript] PostScript 辞書の中身を見る

 
PostScript(Ghostscript)にて、辞書や辞書スタックの中身を確認するのに、pstack コマンドのようなものを探したところ、ppstack や === オペレータが見つかった。
さっそく、=== オペレータを試す。===オペレータは引数に辞書をとるため、以下では予め currentdict でカレント辞書をプッシュしている。
GPL Ghostscript 8.60 (2007-08-01)
Copyright (C) 2007 Artifex Software, Inc. All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.

GS>5 dict begin
GS>/x 100 def
GS>/y 200 def
GS>/z 300 def
GS>/foo { 1 1 add } bind def
GS>currentdict
GS<1>===
<< /x 100 /y 200 /z 300 /foo {1 1 --add--} >>


ただし、この === を userdict などに対して実行すると、ロードされたフォントや手続きが鬼のように出力されてしまう。

[PostScript] PostScript bindオペレータ Cnt'd

 
前回(bindオペレータの仕様)の続き.
今回は、PostScript bind オペレータ の検証.

<解説>
以下、各ケースでの bind 対象の手続きは hoge.
ケース1 では、bind なしで hoge を定義しており、hoge 内の add で実行されるのは再定義した add である.
ケース2 では、hoge は、bind を介して定義しているので、add は、組み込み add が呼び出される.しかし、foo はオペレータ名ではないので、実行時に名前解決されていることに注意.
ケース3 では、hoge の定義の前に add を再定義しているので、hoge の bind 時には、add はオペレータ名とはみなされていない.したがって、実行時名前解決となる.


ケース1 bind なし.

<<ソース>>
/foo {(foo_a) ==} def
/hoge {1 1 add foo} def
/add {pop pop (add_b) ==} def
/foo {(foo_b) ==} def
hoge

<<実行結果>>
GPL Ghostscript 8.60 (2007-08-01)
Copyright (C) 2007 Artifex Software, Inc. All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
GS>(bind1.ps) run
(add_b)
(foo_b)

GS>


ケース2 bind あり.

<<ソース>>
/foo {(foo_a) ==} def
/hoge {1 1 add foo} bind def
/add {pop pop (add_b) ==} def
/foo {(foo_b) ==} def
hoge

<<実行結果>>
GPL Ghostscript 8.60 (2007-08-01)
Copyright (C) 2007 Artifex Software, Inc. All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
GS>(bind2.ps) run
(foo_b)
GS<1>pstack
2

GS<1>


ケース3 bind あり(オペレータ名なし).

<<ソース>>
/add {pop pop (add_a) ==} def
/foo {(foo_a) ==} def
/hoge {1 1 add foo} bind def
/add {pop pop (add_b) ==} def
/foo {(foo_b) ==} def
hoge

<<実行結果>>
GPL Ghostscript 8.60 (2007-08-01)
Copyright (C) 2007 Artifex Software, Inc. All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
GS>(bind3.ps) run
(add_b)
(foo_b)

GS>

[PostScript] PostScript bindオペレータ

 
bind オペレータは、手続きを引数として取り、その手続き内の演算名を実際の演算処理に置換し、戻り値として、その置換した手続きをスタックにプッシュする。言い換えれば、手続き内の演算子を演算オブジェクトに結合する。
結合対象となる名前は、再定義(オーバライド)されていない add や sub などの演算名である。

PostScript では、演算子と同一の名前を持つ手続きを定義できることから、通常の手続きの呼び出しでは、演算子に対しても、カレント辞書スタックで名前検索が行なわれる。
しかし、bind 定義された手続きは、もはや演算子を含まないので、実行時、演算子の名前検索は実施されない。その分、効率的である。

なお、early binding とは静的名前解決のこと。対義語として、late binding というのがあり、これは実行時の名前解決を意味する。
early binding の日本語訳は直訳は「早期結合」だが「事前バインディング」、が一般的のようだ。一方、late binding は直訳は「遅延結合」、一般的には「実行時バインディング」という。

以下、PostScript Language Reference, third edition
http://www.adobe.com/products/postscript/pdfs/PLRM.pdfより.

The bind operator first systematically replaces names with operators in a procedure. For each executable name whose value is an operator (not an array, procedure, or other type), it replaces the name with the operator object. This lookup occurs in the dictionaries that are on the dictionary stack at the time bind is executed.
bind オペレータは、先ず体系的に、手続きの中の名前を演算に変換します。
値が演算(配列、手続き、その他の型ではない)である実行可能な名前に対して、名前を演算に変換します。この検索は、辞書スタックにある辞書のなかで、bind を実行した時に実施されます。

The effect of bind applies not only to the procedure being bound but to all subsidiary procedures (executable arrays or executable packed arrays) contained within it, nested to arbitrary depth.
bind の効果は、そのbindされている手続きだけではなく、その手続き内に含まれる任意の深さに入れ子にされた副次的な手続き(実行可能な配列、実行可能なpacked配列)にまで適用されます。

次回へ続く.

[PostScript] PostScript 入門

 
PostScript入門
http://tutorial.jp/graph/index.html
にあるDaikokuさん作成の PostScript実習マニュアル が非常に参考になる。

資料のPDF版ファイル名は、psman.pdf
前のページ 次のページ