如何找到PostScript词典的名称?
查看PostScript词典只是将-dict-放在堆栈上。 是的,使用{== ==} forall可以轻松查看内容。 是的,可以使用{== exit} forall找到一个示例内容名称 是的,可以轻松找到已存储项目的数量。
是的,可以找到所有词典的总内容 类似于 https://www.tinaja.com/psutils/snoop2a.psl何时和如果您提前知道他们的名字。
但是如何直接找到当前词典的名称?
预期:名称对象,如/ userdict
答案 0 :(得分:0)
您找不到PostScript词典的名称,因为PostScript词典没有名称。
将字典对象与名称相关联时,您正在做的是在另一个字典中创建键/值对。键是名称,值是字典。如果您没有指定其他字典来创建该对,那么它们将在当前字典中创建。如果您尚未将其称为“开始”,那么userdict通常是当前词典。
因此,如果您执行以下操作:
/MyDict 10 dict def
您正在做的是创建一个字典对象,并将其与当前字典中的名称/ MyDict关联。当您稍后执行MyDict
时,解释器会搜索当前词典,然后搜索词典堆栈中的所有其他词典,以查找名称为/ MyDict的键。找到键后,它将拉出关联的字典并将其推入操作数(或字典)堆栈。
除了与其他字典中的键/值对不同之外,该名称与字典没有从不关联。
考虑一下:
/MyDict1 /MyDict2 10 dict dup def def
这将在当前词典中创建两个键/值对,一个键/ MyDict1,另一个键/ MyDict2,但是这些键中的两者与同一词典相关联。那么字典的名称是什么?
请注意,字典和数组等复合对象在PostScript中被视为lilke指针。当您对复合对象执行dup
时,它不会创建新的数组或字典并复制原始对象的所有内容(加上原始对象中任何复合对象的所有内容),而只是将另一个指针推到相同的已分配对象。
如果您要为词典contina命名,则需要在字典内 内存储键/值对。例如:
<<
/Name /MyDict1
>>
或类似的东西。
有一些特殊的字典,它们始终位于词典堆栈中,无法删除; systemdict,globaldict和userdict(某些实现可能还有更多)。
[后来认为]
当然,您可以编写一个PostScript程序,给其一个字典,通过使用forall并检查值的类型,检查当前字典对userdict,systemdict和globaldict中的所有字典是否为eq
为“ dict”。这样,您将具有关联的名称作为另一个参数。
很显然,通过使检查例程递归进行(即,如果这不是我们想要的字典,请检查该字典中的所有词典),然后您便可以检查整个可用于当前网络的词典树,以查看它们是否为您要为其关联名称的字典。
找到匹配项后,您既可以退出循环并递归,也可以继续检查每个可用的字典以查看该字典是否在其他地方被引用。