microbik.ru
  1 2 3 ... 11 12

Стек и арифметические операции



Элементы данных в языке PostScript называются объектами (числа, массивы, строки, символы). Над объектами можно производить различные действия, но если в других языках объекты помещаются в переменные и адресуются указанием имени переменной, то PostScript работает с данными напрямую, используя механизм стека.

Занесение чисел в стек. Любое число, появившееся в исходном файле PostScript-программы заносится в стек. Например, строка -8 10.4 +77...

Интерпретатор по мере ее чтения слева направо выполнит следующие действия:

1. Заносит в стек число -8; перемещает указатель на следующую свободную позицию.

2. Заносит в стек число 10.4; перемещает указатель на следующую позицию и т. д.

рисунок

Теперь в вершине стека число 77 и оно может быть использовано первым в какой либо операции. Остальные числа используются в порядке обратном порядку их занесения в стек.

Таким же образом в стек могут быть занесены PostScript-объекты любого вида: массивы, строки и такие экзотические объекты этого языка как словари.

Для упрощения объяснений рассмотрим сначала операции в стеке над числами. Обратите внимание, что пробелы, символы табуляции и новой строки являются в PostScript-программе разделителями объектов, другие символы типа круглых и квадратных скобок в некоторых случаях также могут быть разделителями.

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



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



<< предыдущая страница   следующая страница >>