Что делает индексный метод в postscript? - PullRequest
0 голосов
/ 27 января 2020

Я не понимаю, что индекс method делает в postscript?

Давайте возьмем этот код, например:


GS<2>stack
--nostringval-- <-- is an array [3 2 4]
3

GS<2> {
    dup             
    2 index <-- What is the index doing?        
    gt              
    {exch} if       
    pop             
  } forall

1 Ответ

1 голос
/ 27 января 2020

У вас есть копия справочного руководства по языку 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.

...