Syntax 如何处理;获得;关于PostScript中的一个过程

Syntax 如何处理;获得;关于PostScript中的一个过程,syntax,postscript,Syntax,Postscript,我正在编写postscript解释器,但不知道应该如何处理以下代码。具体来说,我不知道如何在过程(代码块的最后一行)上使用get。get对程序有效吗?如果是,嵌套过程是否被视为一个元素?如果是,这是否意味着应将{pop 0}添加到堆栈中 userdict /internaldict { count 0 eq { /internaldict errordict /invalidaccess get exec } if dup type /integertype ne {

我正在编写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

感谢您提供的任何澄清

基本上,请阅读《第三版PostScript语言参考手册》第3.3.6节,其中(通常)对这一点进行了非常清楚的解释

压缩数组是普通数组更紧凑的表示形式, 主要用于作为程序使用。压缩数组对象是 与普通数组对象不同(它具有packedarray类型 而不是数组),但在大多数方面,它的行为与 普通数组

正如本文所说,packedarray与常规数组几乎没有区别,因此
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
,第三个元素是另一个packedarray
{/internaldict errordict/invalidaccess get exec}

因此,是的,您应该在操作数堆栈上以{pop 0}结束


你知道你可以自己用Ghostscript来调查这类问题吗?如果出于某种原因,您不相信Ghostscript是一个合格的PostScript解释器,您可以随时与PLRM检查其行为。

感谢您对此事的澄清!我不知道Ghostscript可以这样使用,我一定会在将来检查它!我认为这些可能只是可执行数组,但不是打包的。否则,
put
将导致问题。祝您的解释器好运!你可以在(许多是我写的!)