Dictionary 如何查看PostScript词典的名称?

Dictionary 如何查看PostScript词典的名称?,dictionary,postscript,Dictionary,Postscript,如何查找PostScript词典的名称 查看PostScript字典只需在堆栈上放置一个-dict-。 是的,内容很容易用{=}浏览。 是的,可以使用{==exit}for all找到示例内容名称 是的,可以很容易地找到储存物品的数量 是的,所有词典的全部内容都可以找到 有点像 如果你提前知道他们的名字 但是我怎样才能直接找到当前词典的名称呢 应为/userdict这样的名称对象,因为PostScript字典没有名称,所以找不到PostScript字典的名称 当您将一个dictionary对象与

如何查找PostScript词典的名称

查看PostScript字典只需在堆栈上放置一个-dict-。 是的,内容很容易用{=}浏览。 是的,可以使用{==exit}for all找到示例内容名称 是的,可以很容易地找到储存物品的数量

是的,所有词典的全部内容都可以找到 有点像 如果你提前知道他们的名字

但是我怎样才能直接找到当前词典的名称呢


应为/userdict这样的名称对象,因为PostScript字典没有名称,所以找不到PostScript字典的名称

当您将一个dictionary对象与一个名称关联时,您所做的是在另一个dictionary中创建一个键/值对。键是名称,值是字典。如果未指定要在其中创建对的其他词典,则将在当前词典中创建它们。如果您没有调用“begin”,那么userdict通常是当前字典

所以,如果你做了如下事情:

/MyDict 10 dict def
您要做的是创建一个dictionary对象并将其与当前dictionary中的名称/MyDict关联。稍后执行
MyDict
时,解释器将搜索当前词典,然后搜索词典堆栈上的所有其他词典,以查找名为/MyDict的键。当它找到该键时,它会拉取关联的字典并将其推送到操作数(或字典)堆栈上

除了作为另一个字典中的键/值对之外,该名称从不与该字典关联

考虑这一点:

/MyDict1 /MyDict2 10 dict dup def def
这将在当前字典中创建两个键/值对,一个具有键/MyDict1,另一个具有键/MyDict2,但是这两个键都与同一个字典关联。那么这本字典的名字是什么呢

请注意,复合对象(如字典和数组)在PostScript中被视为lilke指针。在复合对象上执行
dup
操作时,它不会创建新数组或字典,也不会复制原始对象的所有内容(加上原始对象中任何复合对象的所有内容),它只会将另一个指针推送到已分配的同一对象

如果希望词典包含名称,则需要在词典中存储一个键/值对。例如:

<<
  /Name /MyDict1
>>
>
或者类似的东西

有一些特殊的字典总是在字典堆栈上,无法删除;systemdict、globaldict和userdict(一些实现可能有更多)

[后来想] 当然,您可以编写一个PostScript程序,在给定字典的情况下,通过使用forall并检查“dict”值的类型,将userdict、systemdict和globaldict中的所有字典与当前字典进行检查,以查看是否存在
eq
。这样,您就可以将关联的名称作为另一个参数

显然,通过使检查例程递归(即如果这不是我们想要的词典,请检查该词典中的所有词典),您将能够检查整个当前可用的词典树,以查看它们是否是您想要关联名称的词典


您可以在找到匹配项后立即退出循环和递归,也可以继续检查每个可用字典,查看字典是否在其他地方引用。

在PS程序中,我用/woof定义了一个字典。在这本词典中还有另一本词典,定义为/bark/woof显然是与较高字典相关联的名称,/bark是与较内部字典相关联的名称。程序将bark字典放在堆栈的顶部。==将此报告为--dict--。我如何从dict到name/woof?有时,一种方法是创建一个包含所有已知字典长度的主列表。检查长度是否有可能击中。我需要一些更“正式”和更优雅的东西。是的,可以编写一个缓慢而复杂的/findnameofhostdictionary例程,创建一个完整的当前“字典树图”。我想我真正想要的是,如果我错过了一些简单而明显的对更快、更短、更干净代码的误用。不,如果不遍历字典堆栈并检查每个对象以确定它是否是您想要的,就无法在任何当前字典中找到与某个对象相关联的键。对不起,事情就是这样。您可能还需要记住,键/值对中的键不需要是名称。Ghostscript有一些恶意代码,其中键/值字典对的键本身就是一个字典。我有一个名为
wherevalue
的函数,它使用
forall
搜索字典,就像您描述的那样。我有一些旧代码可以做到这一点,如果dict是在dictstack的某个地方定义的。