也许是一个奇怪的问题,不确定它是否有意义,或者我是否还没有正确的学习点才能正确理解它。
在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;
}
答案 0 :(得分:2)
名称只是一系列字符,如第54页的PLRM中所定义。存储的详细信息无关紧要。
可以将字符串存储为字符,以及一些相关数据,将其定义为名称对象,而不是字符串对象。或者您可以使用字符和前面的'\'存储字符串,因此您知道它的名称。
它的文字或可执行文件是否是一个单独的属性。
我相信我所知道的所有实现都存储名称的字符,而不包含前面的'/',并分别维护确定其类型和属性的数据。通常这是因为它们维护着一种“通用”数据类型,从中可以导出所有其他数据类型。
但是没有任何东西说你必须这样做,而且实际上你不应该关心解释器如何实际存储对象,前提是它的行为符合规范。
可执行文件和文字之间的区别实际上与执行有关。如果我这样做:
/测试
然后我创建一个文字名称,然后将其推送到操作数堆栈(因为这是我们使用所有文字)所做的事情。但是,如果我这样做:
测试
然后我创建一个可执行文件名,并执行它。
参见PLRM“执行特定类型”第50页第3.5.5节
答案 1 :(得分:2)
名称与字符串几乎相同,但设计得比较快。因此,名称对象中的存储值通常是散列值或指向与名称关联的字符串缓存的指针。
您可以浏览xpost implementation of type operators here
或functions common to all objects here
或implementation of names using ternary search tree and stack of strings。