如何处理PostScript中的过程“获取”

时间:2018-01-28 23:25:40

标签: syntax postscript

我正在编写一个postscript解释器,但不知道应该如何处理以下代码。具体来说,我不知道如何处理在过程(代码块的最后一行)上使用getget对程序有效吗?如果是这样,嵌套过程是否被视为一个元素?如果是,那是否意味着应该将{ 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

感谢您提供的任何澄清!

1 个答案:

答案 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检查它的行为。