我正在编写一个postscript解释器,但不知道应该如何处理以下代码。具体来说,我不知道如何处理在过程(代码块的最后一行)上使用get
。 get
对程序有效吗?如果是这样,嵌套过程是否被视为一个元素?如果是,那是否意味着应该将{ pop 0 }
添加到堆栈中?
userdict /internaldict
{
count 0 eq
{ /internaldict errordict /invalidaccess get exec }
if
dup type /integertype ne
{ /internaldict errordict /invalidaccess get exec }
if
dup 1183615869 eq
{ pop 0 }
{ /internaldict errordict /invalidaccess get exec }
ifelse
}
dup 14 get 1 25 dict put
感谢您提供的任何澄清!
答案 0 :(得分:1)
嗯,从根本上说,请阅读第3版PostScript语言参考手册的第3.3.6节,其中(照例)非常清楚地解释了这一点。
打包数组是普通数组的更紧凑的表示, 主要用作程序。打包的数组对象是 与普通数组对象不同(它具有类型packedarray 而不是数组),但在大多数方面它的行为与a相同 普通阵列。
正如文本所说,压缩阵列与常规数组几乎无法区分,因此get
在压缩数组上的功能与普通数组完全相同。
所以举一个具体的例子:
%% procedure to convert PostScript units to inches
%% usage: units inch inches
/inch {
72 div
} bind def
现在,如果我这样做:
/inch load 0 get ==
结果是72,而
/inch load 1 get ==
结果
- DIV -
对于您发布的代码,“get”将检索打包数组的第14个元素(从0开始)。在您的情况下将是:
{pop 0}
数组的所有常用规则都适用,因此数组中的数组是父元素的单个元素。
因为第0个元素是count
,第一个元素是0
,第二个是eq
,第三个是另一个压缩阵列{ /internaldict errordict /invalidaccess get exec }
等等。
所以是的,你最终应该在操作数堆栈上使用{pop 0}。
你知道你可以使用Ghostscript自己调查这类问题吗?如果由于某种原因你不相信Ghostscript是一个符合要求的PostScript解释器,你总是可以用PLRM检查它的行为。