Нужна помощь в понимании этого постскриптумного кода: каков порядок выполнения кода? - PullRequest
0 голосов
/ 22 января 2020
0 5 360 5 mul {sin} for
stack
quit

Я понимаю, что у нас есть для l oop с диапазоном от 0 до> 360 с шагом 5. Однако 5 mul сбивает с толку. Почему это перед телом циклов for? 5 mul применяется для чего? Где первый аргумент? то есть: 4 5 mul, что составляет 4 х 5 = 20.

Ответы [ 2 ]

4 голосов
/ 22 января 2020

Первый аргумент - угадайте, что - 360:

0 5 1800 {sin} for stack quit

PostScript ориентирован на стек, и специального синтаксиса для for l oop нет. Поэтому вы можете указать любые выражения для первых трех значений. Это сделало бы его итерацию 360 раз, от 0 до 1800 (что составляет 360 × 5), с шагом 5. Хотя я не знаю, почему это происходит.

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

(Не ответ, но нужно форматирование.)

PostScript - это стек-ориентированный язык. Операторы принимают количество аргументов, которые они ожидают от стека. Вы можете поиграть с этим в интерпретаторе, таком как Ghostscript:

GS> 5 360 mul
GS<1> stack
1800

На этом этапе стек равен [1800].

Если вы предоставите больше аргументов, чем оператор примет, эти значения будут все еще в стеке в ожидании чего-то еще:

GS> 0 5 360 5 mul
GS<3> stack
1800
5
0

Поскольку mul принимает два значения, он просто выскочит 5 и 360, произведет умножение и pu sh ответ в стек. То есть до mul ваш стек будет таким:

GS> 0 5 360 5
GS<4> stack
5
360
5
0

Если бы вы сделали mul, теперь вы бы получили то же самое:

GS<4> mul
GS<3> stack
1800
5
0

Тогда код продолжается, как и раньше, с {sin} for.

. Вы можете выполнять все команды одновременно, как показано, или делать это позже - стек - это просто стек: он изменяется как вы go. Так что, если вы сделаете это так:

GS> 0 5 360 5 mul { sin } for
GS<361>

или

GS> 0 5 360 5
GS<4> mul
GS<3> { sin }
GS<4> for
GS<361>

, вы получите то же самое.

В GhostScript (gs) число в <nnn> является текущей глубиной стека.

Языки, основанные на стеке, могут быть немного запутанными, если вы не привыкли к парадигме (или старше Калькуляторы HP :) Forth - это канонический пример стекового языка (и это здорово). Я скучаю по дням Forth и PostScript (раньше я писал принтеры и активно использовал Forth во встроенных системах). Существуют и более современные языки, основанные на стеке (Kitten, Factor).

...