О начальное значение CV (здесь будем называть его init); О приращение, которое претерпевает CV при каждой итерации (назовем его incr); О предельное значение CV, при котором итерация прекращается (назовем его limit); О процедура, выполняемая при каждой итерации (назовем ее ргос). Команда для for имеет следующий вид:
init incr limit ргос for -» - В зависимости от знака приращения работа оператора for слегка различается.
Г5, Команды решений и итераций
1031
Когда приращение incr положительное Когда i пег положительно, начальное значение CV устанавливается в init. Если CV не превосходит 1 imi t, то значение CV проталкивается в стек операндов (для возможного использования внутри процедуры), и выполняется процедура ргос. Ватем к CV прибавляется приращение i пег. CV снова сравнивается с limit, и если она не превосходит limit, то процедура выполняется. Работу цикла проще понять, если сравнить ее с тем, как работает цикл for на языке С:
for(CV » init: CV <- limit: CV +- incr) {
< push CV >; /* pseudo-code: push the value of CV */ /* псевдокод: проталкиваем значение CV */
< execute proc >;
}
Примеры
Тщательно проследите содержимое стека при каждой итерации на примерах следующих фрагментов кода: О Проталкиваем в стек значения 12 3 4 5:
1 1 5 { } for % note the empty procedure % отметим, что процедура пустая Поскольку значения CV были протолкнуты в стек командой for, но не были вытолкнуты оттуда внутри процедуры, они остаются в стеке. О Помещаем в стек первые десять степеней двойки (то есть 1,2,4,8..... 1024):
1 0 1 10 {pop dup 2 mul} for
При старте в стек помещается 1. Вдесь значение CV не используется, поэтому его необходимо выталкивать при каждой итерации. О Просуммируем числа от 1 до 10 и оставим результат в стеке:
0 1 1 10 {add} for
Первый 0 перед параметрами for требуется для того, чтобы поместить в стек начальное значение суммы (0).
О Нарисуем шахматную доску с рис. Г.23, используя уровни серого цвета 0,3 и 0,7 и задав начало координат в левом нижнем углу.