ps文件在过程中调用“长度”

时间:2018-06-26 15:45:19

标签: postscript

我有一行ps文件:

^ab {@st0 setfont}^ap

在此处定义^ab时:

/^ab{1000 array 0 1000}bind def

^ap在这里定义:

/^ap{
    dup length 3 index add dup 3 index lt{
        4 index exch 6 2 roll exch
        4 1 roll putinterval
    }{
        3 -1 roll 1000 add dup
        {array}stopped{
            pop pop pop
            3 1 roll 0 exch getinterval
            cvx bind
            1000 array dup 0 4 -1 roll put
            dup 1 /exec load put
            2 1000 4 -1 roll ^ap
        }{
            dup 0 8 -1 roll putinterval
            dup 6 -2 roll putinterval
            3 1 roll
        }ifelse
    }ifelse
}bind def`

因此,如果我正确阅读,^ab将在堆栈上创建一个大小为1000和2个整数的数组:0和1000。 然后,过程{@st0 setfont}被保存在堆栈中,因此堆栈如下所示:

[array, 0, 1000, {@st0 setfont}]

然后用^ap调用dup,这将复制堆栈上的过程,然后调用length,它应获取堆栈中最上面的项的长度,该项是重复项程序,但这对我来说没有意义。 length仅应在字符串,数组或字典上调用。那么这是怎么回事? 还是我解释错了?

2 个答案:

答案 0 :(得分:2)

过程。通常是一个压缩数组,但这无关紧要。这里发生的是它得到数组{@st0 setfont}的长度为2。

尝试在长度后面加上pstackdup ==到/ ^ ap过程的定义中。

答案 1 :(得分:2)

肯已经回答了一个基本问题,但是我希望我的评论对OP理解此代码有所帮助。

我有根据的猜测是,缩写是ab =“ array begin”和ap =“ append”。

似乎将三个对象放在一起,几乎就像一个元组,但所有三个都在堆栈中。数组本身的“写头”位置,容量。然后,它将填充数组,直到position> capacity。然后变得有趣。它会尝试分配一个更大的数组并继续运行,但是如果由于某种原因无法分配一个更大的数组,它将包装{ ... } exec中的内容,并制作一个仅包含该数组的新小数组。

非常聪明。该代码来自哪里?