PostScript cvn 运算符

PostScript cvn operator

可能是一个奇怪的问题,不确定它是否有意义或者我还没有达到正确的学习点来正确理解它。

在 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 中所定义。存储的详细信息无关紧要。

可以将字符串存储为字符,以及一些关联数据以将其定义为名称对象,而不是字符串对象。或者您可以存储包含字符和前面的“\”的字符串,这样您就知道它的名称了。

它的文字或可执行文件是否是一个单独的属性。

我相信我所知道的所有实现都存储名称 的字符而没有 前面的 '/',并单独维护确定其类型和属性的数据。通常那是因为它们维护一个 'common' 数据类型,所有其他数据类型都从该数据类型派生。

但是没有任何内容表明您必须那样做,而且实际上您不应该关心解释器实际如何存储对象,前提是它的行为符合规范。

可执行文件和文字之间的区别实际上与执行有关。如果我这样做:

/测试

然后我创建一个文字名称,然后将其推入操作数堆栈(因为这就是我们对 all 文字所做的)。但是,如果我这样做:

测试

然后我创建一个可执行文件名,并执行它。

参见 PLRM 第 50 页第 3.5.5 节 "Execution of specific types"

名称与字符串几乎相同,但旨在更快地进行比较。因此,名称对象中存储的值通常是哈希值或指向与名称关联的字符串缓存的指针。

您可以浏览xpost implementation of type operators here
functions common to all objects here
implementation of names using ternary search tree and stack of strings.