我有一行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
仅应在字符串,数组或字典上调用。那么这是怎么回事?
还是我解释错了?
答案 0 :(得分:2)
过程是。通常是一个压缩数组,但这无关紧要。这里发生的是它得到数组{@st0 setfont}
的长度为2。
尝试在长度后面加上pstack
或dup ==
到/ ^ ap过程的定义中。
答案 1 :(得分:2)
肯已经回答了一个基本问题,但是我希望我的评论对OP理解此代码有所帮助。
我有根据的猜测是,缩写是ab =“ array begin”和ap =“ append”。
似乎将三个对象放在一起,几乎就像一个元组,但所有三个都在堆栈中。数组本身的“写头”位置,容量。然后,它将填充数组,直到position> capacity。然后变得有趣。它会尝试分配一个更大的数组并继续运行,但是如果由于某种原因无法分配一个更大的数组,它将包装{ ... } exec
中的内容,并制作一个仅包含该数组的新小数组。
非常聪明。该代码来自哪里?