为什么字典键需要前面的斜杠
Why dictionary keys need the preceding slash
这个很好用
/posX 200 def
posX 100 moveto
这行不通
/positions 1 dict def
positions begin
/posX 200 def
end
positions posX get 100 moveto
经过几个小时的努力,我偶然发现了让它工作的方法
positions /posX get 100 moveto
有人可以解释为什么在使用字典键时需要保留斜杠吗?
我查看了参考手册并在网上搜索,但找不到任何解释(我确定它在某个地方,我只是找不到它)。
特别是如果有人能指出参考手册中描述(对我来说)似乎很奇怪的行为的部分,我将不胜感激。
嗯字典键 不需要 'preceding slash',但我们会回过头来。
正斜杠引入了一个文字名称对象,相同的名称但没有'/'也引入了一个名称,但在这种情况下它是一个可执行文件 姓名。
您可以在第 3 版 PLRM 的第 36 页找到它。第 3.3.2 节对象的属性实际上从第 35 页开始,但文字和可执行属性在第 36 页描述:
• Names are literal if they are preceded by / and executable if they
are not.
在页面顶部定义了解释器遇到文字或可执行对象时的操作:
• If the object is literal, the interpreter treats it strictly as data
and pushes it on the operand stack for use as an operand of some
subsequent operator.
• If the object is executable, the interpreter executes it.
因此,当您将 /posX 作为文字名称对象放置时,解释器将其视为数据,将其压入操作数堆栈以供以后使用。当您将 posX 放入可执行名称对象时,解释器将尝试执行它。
仍然在同一页 (36) 我们看到:
• Executing an executable name causes it to be looked up in the
current dictionary context and the associated value to be executed.
因此,在遇到 /posX 时,解释器会创建一个名称对象 'posX' 并将其放入操作数堆栈。遇到 posX 时,解释器会尝试在当前字典中查找 'posX' 作为键。
您的密码是:
/positions 1 dict def
positions begin
/posX 200 def
end
positions posX get 100 moveto
您已经在字典 'positions' 上使用过 begin
,因此它已经是当前字典。这意味着不是使用 get
从 'positions' 检索值,您可以(在 PostScript 中更常见的是)这样做:
/positions 1 dict def
positions begin
/posX 200 def
posX 100 moveto
end
显然那里的缩进只是为了强调,以显示字典的当前位置。
现在进入旁注。字典键不必是名字!它们几乎总是如此,但有时能够使用 'something else' 作为密钥很有用。举一个有点人为的例子,假设我想知道有多少文本使用了文档中的所有字体。
%!
/MyDict 20 dict dup def begin
/FontNumbers 20 dict def
/old_show show load def
/show {
currentfont dup
FontNumbers known {
dup FontNumbers get 1 add FontNumbers exch put
}{
FontNumbers exch 1 put
} ifelse
old_show
} bind def
end
现在我们每次使用'show'都会在当前字典中查找'FontNumbers'。然后,我们使用 currentfont
返回的字体字典作为键,并查看该键是否存在于字典中。如果是我们 get
关联值,加 1 和 put
新值,再次使用当前字体字典作为键。如果未找到键,则我们放置一个 key/value 对,其中值为 0,键是当前字体字典。
注意!我没有尝试过该代码,它很可能有错误,这只是为了说明字典中的键不必是名称,它可以是任何类型的对象。请参阅 PLRM 第 41 页,第 3.3.9 节字典对象。
这个很好用
/posX 200 def
posX 100 moveto
这行不通
/positions 1 dict def
positions begin
/posX 200 def
end
positions posX get 100 moveto
经过几个小时的努力,我偶然发现了让它工作的方法
positions /posX get 100 moveto
有人可以解释为什么在使用字典键时需要保留斜杠吗?
我查看了参考手册并在网上搜索,但找不到任何解释(我确定它在某个地方,我只是找不到它)。
特别是如果有人能指出参考手册中描述(对我来说)似乎很奇怪的行为的部分,我将不胜感激。
嗯字典键 不需要 'preceding slash',但我们会回过头来。
正斜杠引入了一个文字名称对象,相同的名称但没有'/'也引入了一个名称,但在这种情况下它是一个可执行文件 姓名。
您可以在第 3 版 PLRM 的第 36 页找到它。第 3.3.2 节对象的属性实际上从第 35 页开始,但文字和可执行属性在第 36 页描述:
• Names are literal if they are preceded by / and executable if they are not.
在页面顶部定义了解释器遇到文字或可执行对象时的操作:
• If the object is literal, the interpreter treats it strictly as data and pushes it on the operand stack for use as an operand of some subsequent operator.
• If the object is executable, the interpreter executes it.
因此,当您将 /posX 作为文字名称对象放置时,解释器将其视为数据,将其压入操作数堆栈以供以后使用。当您将 posX 放入可执行名称对象时,解释器将尝试执行它。
仍然在同一页 (36) 我们看到:
• Executing an executable name causes it to be looked up in the current dictionary context and the associated value to be executed.
因此,在遇到 /posX 时,解释器会创建一个名称对象 'posX' 并将其放入操作数堆栈。遇到 posX 时,解释器会尝试在当前字典中查找 'posX' 作为键。
您的密码是:
/positions 1 dict def
positions begin
/posX 200 def
end
positions posX get 100 moveto
您已经在字典 'positions' 上使用过 begin
,因此它已经是当前字典。这意味着不是使用 get
从 'positions' 检索值,您可以(在 PostScript 中更常见的是)这样做:
/positions 1 dict def
positions begin
/posX 200 def
posX 100 moveto
end
显然那里的缩进只是为了强调,以显示字典的当前位置。
现在进入旁注。字典键不必是名字!它们几乎总是如此,但有时能够使用 'something else' 作为密钥很有用。举一个有点人为的例子,假设我想知道有多少文本使用了文档中的所有字体。
%!
/MyDict 20 dict dup def begin
/FontNumbers 20 dict def
/old_show show load def
/show {
currentfont dup
FontNumbers known {
dup FontNumbers get 1 add FontNumbers exch put
}{
FontNumbers exch 1 put
} ifelse
old_show
} bind def
end
现在我们每次使用'show'都会在当前字典中查找'FontNumbers'。然后,我们使用 currentfont
返回的字体字典作为键,并查看该键是否存在于字典中。如果是我们 get
关联值,加 1 和 put
新值,再次使用当前字体字典作为键。如果未找到键,则我们放置一个 key/value 对,其中值为 0,键是当前字体字典。
注意!我没有尝试过该代码,它很可能有错误,这只是为了说明字典中的键不必是名称,它可以是任何类型的对象。请参阅 PLRM 第 41 页,第 3.3.9 节字典对象。