私は即時実行と遅延実行を回避するつもりです。 私が理解しているところでは、インタープリターは遅延実行中かどうかを知るフラグを保持しています。PostScriptの即時実行または遅延実行
プロシージャの遅延実行は、名前検索によってプロシージャが返された可能性があります。
今、どのタイプ、アクション、または操作がこのインタープリタフラグを制御しているかを調べようとしています。
たとえば、以下のコードでは、手続きを返す最後にすぐに評価された名前があります。それは(xcheck)実行可能である一方、しかし、この手順は、プッシュされる:
/setdata
{
/a 1 def
/b 0 def
/foo
a 0 ne
b 0 ne
and
def
{ foo false and }
} def
//setdata
私は特別なルールがあります知っている:直接登場
手順(どちらかから を読まされているプログラムの一環として、ファイルまたはメモリ内のより大きなプロシージャの一部として)は通常、 の定義の一部または条件付きのような構文の一部であり、 がプロシージャに対して明示的に処理されます。例えば、名前を検索した結果、間接的に を取得した手続きは、通常は実行する予定の です。 PostScriptプログラムは、必要に応じてこれらの セマンティクスを無効にすることができます。
プロシージャに直接遭遇した場合(実行可能であっても)、プッシュする必要があることを理解します。 (すぐに評価される名前は直接遭遇するプロシージャを返しますので、OSにプッシュする必要があります)
私はこのロジックをインタプリタで実装するコードを考えていますが、 :
リテラル名のルックアップがある場合は、インタープリターのDeferredFlag = trueを設定します。 遅延実行がいつ終了するのかを知るにはどうすればよいですか?私は "def"という名前に遭遇するとハードコードできますが、他にもあるかもしれません。
(+どのような場合の手順では、実行されている手順にネストされている。など...)
私は、現在の実行モードを知っているインタプリタでそのDeferredFlagを制御する方法を見つけることができません。
質問は明らかです。
アップデート:私は成功せず、デバッグしよう
いくつかの余分なコードサンプル。
コード1:
/foo { 2 3 add } def
foo
% result: 5
コード2:
/foo { 2 3 add } def
//foo
% result: { 2 3 add }
コード3:
/foo { 2 3 add } def
/bar { foo } def
bar
% result: 5
コード4:
すぐに評価された名前について。例えば、返されるべきプロシージャの場合(imm。eval。nameの結果として)。 これは、例えば{2 3 add}のような1つのプロシージャオブジェクトを返しますか、これはトークン{、トークン2、トークン3、トークン追加、トークン}を表す5つのトークンを返しますか? – juFo
1つのプロシージャー・オブジェクトを戻します。これについて考えるには2つの方法があります。 'def'は常にその値に対して単一のオブジェクトをとり、直ちに評価される名前は常に前の' def'から値を生成するので、すぐに評価される名前は単一のオブジェクトしか返せません。 OTOHのすべてのプログラム構造体は 'token'演算子を通してインタプリタに入り、' token'は常に}まで消費して単一のオブジェクトを返します。右括弧がない場合、 'token'はa/syntaxerrorを通知します。だから、 "token {"のようなものはありません。ポストスクリプトでは決して存在することはありません。 –