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


Оператор ifelse - часть 2


Ну, а если у вас по ходу чтения уроков возникли вопросы, предложения или пожелания, вы можете связаться с автором по телефону (095)237-8901 или по адресу chief@pcweek.ru.

 

Циклы

 

В языке PostScript имеется три основных конструкции циклов: простой цикл, индексируемый цикл и условный цикл.

Простой цикл неявным образом уже использовался в примерах предыдущего занятия. Он реализуется с помощью оператора  repeat,  который берет из стека два операнда: счетчик цикла и повторяемую процедуру. Например, для очистки стека мы использовали следующий цикл:

4 {pop} repeat

Здесь всё достаточно прозрачно, непривычно, может быть, только то, что в качестве одного из аргументов выступает повторяемая процедура.

Задание. Нарисуйте последовательность из N вложенных кругов, квадратов, эллипсов.

Индексируемый цикл напоминает широко известную по Бейсику конструкцию for... to... next. Оператор for берет из стека четыре операнда: начальное значение счетчика цикла, его приращение, конечное значение счетчика цикла и повторяемую процедуру. За исключением последнего операнда всё выглядит как и в обычной конструкция for. Следует учитывать, что непосредственно перед выполнением этой процедуры for  помещает в стек  текущее значение счетчика и, если он не используется, то его следует оттуда явным образом удалять.

Следующая строка напечатает звездочку через каждые 15 единиц на странице:

0 15 450 {0 moveto (*) show } for

Задание. Нарисуйте пунктирную линию.

Вторая важная особенность for в том, что его операнды не обязательно должны быть целыми числами. Вот пример использования этого для возможной модификации шрифта:

/Helvetica findfont 30 scalefont setfont

/printword

{ 0 0 moveto (PC Magazine) show} def

200 300 translate

.95 -.05  0  % начало приращения, конец

{setgray printword -1.5 translate} for

1 setgray printword

showpage

<рис. файл p4_1.ps>

Условный цикл соответствует конструкции repeat...until в Паскале. Строится он из двух операторов: loop и exit. Опертор loop повторяет выполнение процедуры до тех пор пока в ней не встретится оператор exit, который заканчивает циклическое выполнение, причем не только в конструкции loop, но и в for, repeat и forall (об этой специальной форме цикла будет расказано ниже). Если в повторяемой процедуре нет оператора exit, то цикл будет бесконечным, например:

{(PC Magazine) show} loop

будет бесконечно печатать слово PC Magazine.

Нарисуем незамысловатую последовательность кругов просто, чтобы продемонстрировать работу loop - exit.

/pagewidth 8 72 mul def

/circle

{x y radius 0 360 arc stroke} def

/new-x

{x radius add

/x exch def} def

/dolineofcrle

{/y exch def

/radius exch def

/x 0 def

{x pagewidth le

 {circle new-x}

 {exit} ifelse

} loop

} def

% main

15 200 dolineofcrle

25 200 dolineofcrle

showpage




- Начало -  - Назад -  - Вперед -



Книжный магазин