PS-файл, вызывающий длину в процедуре - PullRequest
0 голосов
/ 26 июня 2018

У меня есть файл 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 голосов
/ 27 июня 2018

Кен уже ответил на основной вопрос, но я надеюсь, что мои комментарии помогут ОП понять этот код.

Мое обоснованное предположение состоит в том, что аббревиатуры ab = "array begin" и ap = "append".

Кажется, он поддерживает три объекта вместе, почти как кортеж, но все три находятся в стеке. Сам массив, позиция "пишущей головки", емкость. Затем он заполняет массив до позиции> емкости. Тогда это становится интересным. Он пытается выделить больший массив и продолжать работу, но если по какой-либо причине он не может выделить больший массив, он оборачивает то, что имеет в { ... } exec, и создает новый небольшой массив, содержащий именно это.

Довольно умно. Откуда этот код?

0 голосов
/ 26 июня 2018

Процедура является массивом. Обычно упакованный массив, но это не актуально. Здесь происходит то, что он получает длину массива {@st0 setfont}, равную 2.

Попробуйте вставить pstack или dup == в определение процедуры / ^ ap после длины.

...