也许是一个奇怪的问题,不确定它是否有意义,或者我是否还没有达到正确理解它的正确学习点。
在 PostScript 中,您有 CVN 运算符。
(abc) cvn => /abc
(abc) cvx cvn => abc
现在,以斜杠开头的名称是文字名称,不带斜杠的名称是可执行名称(不谈论任何立即评估的名称)。
如果您在 GhostScript 中测试这两行,则此输出与预期一致。但我真正想知道的是,您看到的输出只是您看到的显示值(= .ToString())值。还是“/”斜杠也存储在名称值中?
例如,对象被存储为 (伪代码):
new Name {
theName = "abc";
isLiteral = true;
}
return ToString() {
if (isLiteral)
return "/abc";
//..
或者更确切地说:
new Name {
theName = "/abc";
}
return ToString() {
return theName;
}
最佳答案
名称仅仅是一个字符序列,如第 54 页的 PLRM 中所定义。存储细节无关紧要。
可以将字符串仅存储为字符,以及一些关联数据以将其定义为名称对象,而不是字符串对象。或者您可以存储带有字符和前面的“\”的字符串,这样您就知道它的名称。
它的文字或可执行文件是否是一个单独的属性。
我相信我所知道的所有实现都存储名称的字符没有前面的“/”,并单独维护确定其类型和属性的数据。通常这是因为它们维护一个“通用”数据类型,所有其他数据类型都源自该数据类型。
但是没有什么表明你必须这样做,而且实际上你不应该关心解释器如何实际存储对象,只要它的行为遵循规范。
可执行文件和文字之间的区别实际上与执行有关。如果我这样做:
/测试
然后我创建一个文字名称,然后将其推送到操作数堆栈(因为这就是我们对所有文字所做的操作)。但是如果我这样做:
测试
然后我创建一个可执行文件名称并执行它。
请参阅 PLRM“特定类型的执行”第 50 页第 3.5.5 节
关于ghostscript - PostScript cvn 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43537597/