У вас есть копия справочного руководства по языку PostScript? Если вы хотите программировать на PostScript, он вам понадобится.
Оператор индекса определен на странице 610 3-го издания PLRM:
index anyn… any0 n index anyn… any0 anyn
удаляет неотрицательное целое число n из стека операндов, ведет обратный отсчет до n-го элемента с вершины стека и помещает копию этого элемента в стек.
Примеры
(a) (b) (c) (d) 0 index Þ (a) (b) (c) (d) (d)
(a) (b) (c) (d) 3 index Þ (a) (b) (c) (d) (a)
Ошибки: проверка диапазона, stackunderflow, проверка типа
См. Также: copy, dup , roll
Итак, в вашем случае индекс удаляет «2» из стека, затем он считает по стеку еще 3 места (index = 2, index = 1, index = 0) и копирует объект, который он находит там, на вершине стека.
Теперь, ваш фрагмент кода работает как «пустая», поэтому при запуске он смотрит на тип операнда на вершине стека. В вашем случае это массив [3 2 4]. Оператор forall поочередно помещает каждый элемент массива в стек, а затем вызывает исполняемый массив, предоставленный оператору forall (это ваш код).
Первое, что делает ваш код, это вызывает 'dup', который дублирует операнд в стеке. Поэтому в первый раз через l oop оператор forall будет выводить sh первый элемент массива, «3», а затем ваш код будет дублировать его. Таким образом, стек будет:
3
3
?
? здесь означает, что в стеке есть что-то неизвестное, мы знаем его там, потому что в интерактивной подсказке GS есть «2», но вы не сказали нам, что это такое.
Мы тогда pu sh 2:
2
3
3
?
и сделайте индекс. Индекс удаляет 2, а затем возвращает 3 места, что приводит нас к?. Это копируется в верхнюю часть стека, поэтому теперь стек выглядит так:
?
3
3
?
Затем он проверяет '?' (без проверки, чтобы определить, является ли его тип данных цифрами c) по сравнению со значением цифр c 3. Если 3 больше чем? затем он возвращает значение true, в противном случае он возвращает значение false.
Итак, теперь наш стек:
true|false
3
?
Затем мы выводим pu sh исполняемый массив, ведущий к этому стеку:
{exch}
true|false
3
?
и выполните оператор if. Если логическое значение 'true', мы выполняем исполняемый массив, если его значение равно false, мы его выбрасываем. Так что если ? > 3 у нас есть:
? % Numeric value > 3
3
В противном случае у нас есть:
3
?
Затем мы выполняем «pop», который удаляет верхний операнд из стека, оставляя либо «?» или 3.
Затем мы go снова округляем l oop, используя значение 2 и, наконец, еще раз, используя значение 4.
Похоже, это 'max' функция, которая возвращает наибольшее значение из массива цифр c данных. Предположительно, начальное значение примерно равно 0.