Search code examples
dictionarypostscriptforall

PostScript forall on dictionaries


According to the PLRM it doesn't matter in which order you execute a forall on a dict:

(p. 597) forall pushes a key and a value on the operand stack and executes proc for each key-value pair in the dictionary

...

(p. 597) The order in which forall enumerates the entries in the dictionary is arbitrary. New entries put in the dictionary during the execution of proc may or may not be included in the enumeration. Existing entries removed from the dictionary by proc will not be encountered later in the enumeration.

Now I was executing some code:

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

My output (operand stack) is:

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

The output of ghostscript and PLRM (operand stack) is:

--------top-
123
/abc
-----bottom-
  1. Does it really not matter in what order you process the key-value pairs of the dict?
  2. on the stack, do you first need to push the value and then the key, or do you need to push the key first? (as the PLRM only talks about "a key and a value", but doesnt tell you anything about the order).

Thanks in advance


Solution

  • It would probably help if you quoted the page number qhen you quote sections from the PLRM, its hard to see where you are getting this from.

    When executing forall the order in which forall enumerates the dictionary pairs is arbitrary, you have no influence over it. However forall always pushes the key and then the value. Even if this is implied in the text you (didn't quite) quote, you can see from the example in the forall operator that this is hte case.

    when you say 'my output' do you mean you are writing your own PostScript interpreter ? If so then your output is incorrect, when pushing a key/value pair the key is pushed first.