(Не ответ, но нужно форматирование.)
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).