Арифметические операторы
Оператор в PostScript - это слово, заставляющее интерпретатор выполнять те или иные действия. Он эквивалентен командам или процедурам в других языках программирования. Когда интерпретатор встречает слово в PostScript-программе, он просматривает свой внутренний словарь и пытается определить, является ли это слово именем оператора. Если оно в словаре найдено, то выполняются все связанные с ним действия, а затем переходит к следующему слову в исходном файле.
Операторы add и sub. Операторы смотрят находятся ли в стеке их операнды. В общем случае оператор удаляет их из стека и помещает туда результат выполнения своих действий. Например, оператор add (сложение) удаляет из стека два верхних числа, складывает их и оставляет сумму в стеке. Так строка программы, приведенная ниже, будет влиять на стек как показано на рисунке. Аналогично работает оператор sub, вычитающий число, находящееся в вершине стека, из числа, лежащего в стеке следующим.
Другие арифметические операторы:
div - деление. Второе число делится на число в вершине стека.
13 8 div -> 1.625
idiv - целочисленное деление.
25 3 idiv-> 8
mod - второе число делится на число в вершине стека, сохраняя остаток от деления.
7 5 mod-> 8
Операнды операторов mod и idiv должны быть целыми числами.
mul - перемножает два числа в вершине стека, помещая вместо них их произведение.
8 9 mul-> 72
neg - изменяет знак числа, находящегося в вершине стека.
-37 neg-> 37
(sgrt, exp, ceiling, sin)
Запись арифметических выражений.
Выражение 5+(8:2) на языке PostScript можно представить несколькими способами:
82 div 5 add
либо
5 8 2 div add
Чуть более сложный случай, выражение 9-(4*7), можно записать минимум двумя способами:
9 4 7 mul sub
4 7 mul 9 exch sub
Во втором способе введен новый оператор exch. Он меняет местами положение двух верхних чисел в вершине стека.
рисунок
Применение оператора exch вызвано тем, что sub вычитает число в вершине стека из следующего за ним, что без exch приводит к неверному порядку действий.
Действия над стеком.
Эта группа операторов, представителем которой был exch добавляет, удаляет и изменяет порядок следования элементов в стеке.
clear а1 а2 clear -
очистка стека - удаляет из стека все элементы 11 6 17 clear -> -
count a1...an count a1...an n
число элементов в стеке
dup a1 dup a1 a1
дублирует в стеке его верхний элемент 8 dup -> 8 8
pop a1 pop -
удаляет из стека его верхний элемент 31 4 pop -> 31
roll
вращает элементы стека, из стека извлекаются два числа. Верхнее говорит сколько раз и в каком направлении вращать элементы стека, второе - сколько элементов вращать.
7 8 9 3 1 roll -> 9 7 8
7 8 9 3 - 1 roll -> 8 9 7
copy a1...an n copy a1...an a1...an
дублирует n верхних элементов стеков
Существует еще ряд более специального вида операторов, работающих со стеком, они будут рассмотрены по мере изложения.
Ряд принтеров, например Apple LaserWriter, позволяет интерактивно с ними взаимодействовать. Вот операторы для этого:
== удаляет элемент из вершины стека и отображает его на экране.
Pstack - печатает все содержимое стека, не изменяя его.
Pstack и == являются полиморфными операторами, так как они в качестве операндов принимают объекты многих типов.