Семь уроков по PostScript
d8671b56

Арифметические операторы


Оператор в 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 и == являются полиморфными операторами, так как они в качестве операндов принимают объекты многих типов.


Содержание раздела