2

PLRM によると、dict で forall を実行する順序は重要ではありません。

(p. 597) forall はキーと値をオペランド スタックにプッシュし、ディクショナリ内の各キーと値のペアに対して proc を実行します。

...

(p. 597) forall が辞書のエントリを列挙する順序は任意です。proc の実行中にディクショナリに追加された新しいエントリは、列挙に含まれる場合と含まれない場合があります。proc によってディクショナリから削除された既存のエントリは、列挙の後半では検出されません。

今、私はいくつかのコードを実行していました:

/d 5 dict def
d /abc 123 put
d { } forall

私の出力(オペランドスタック)は次のとおりです。

--------top-
/abc
123
-----bottom-

Ghostscript と PLRM (オペランド スタック) の出力は次のとおりです。

--------top-
123
/abc
-----bottom-
  1. dict のキーと値のペアをどの順序で処理するかは問題ではありませんか?
  2. スタック上で、最初に値をプッシュしてからキーをプッシュする必要がありますか、それとも最初にキーをプッシュする必要がありますか? (PLRM は「キーと値」についてのみ説明しますが、順序については何も説明しません)。

前もって感謝します

4

1 に答える 1

4

PLRM からセクションを引用するときにページ番号を引用すると、おそらく役立つでしょう。

forall を実行する場合、forall が辞書のペアを列挙する順序は任意であるため、影響はありません。ただし、forall は常にキーをプッシュしてから値をプッシュします。これがあなたが引用したテキストで暗示されている場合でも(完全ではありませんでした)、 forall 演算子の例から、これがケースであることがわかります。

「私の出力」と言うときは、独自の PostScript インタープリターを作成しているということですか? その場合、出力は正しくありません。キーと値のペアをプッシュすると、キーが最初にプッシュされます。

于 2015-04-02T15:33:26.780 に答える