У меня есть файл 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
должен вызываться только для строки, массива или словаря. Так что здесь происходит?
Или я неправильно это понимаю?