Начальный курс программирования на языке Форт


ВЛОЖЕННЫЕ ЦИКЛЫ - часть 2


дает такой результат: СНИЖЕНИЕ 0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 ок

Слово +LOOP начнет с нуля и с шагом, равным -1, «пойдет» к финишной черте, пока не пересечет ее. Заметьте, что в этом направлении мы выполняем цикл фактически 11 раз, поскольку финишная черта всегда лежит между значением границы и ее значением  -1 независимо от того, в какую сторону перемещается +LOOP. Завершение же цикла вызывает переход финишной черты.

Приращение может быть получено каким угодно образом, но на каждом шаге выполнения оно должно находиться в стеке. Рассмотрим пример: : ПРИРАЩЕНИЕ ( приращение граница индекс -- ) DO I . DUP +LOOP DROP ;

Внутри этого определения непосредственно нет приращения. Оно будет взято из стека при выполнении слова ПРИРАЩЕНИЕ наряду с границей и индексом. Посмотрите, что происходит в данном случае: 1 5 0 ПРИРАЩЕНИЕ 0 1 2 3 4 ок 2 5 0 ПРИРАЩЕНИЕ 0 2 4 ок -3 -10 10 ПРИРАЩЕНИЕ 10 7 4 1 -2 -5 -8 ок

Наш следующий пример демонстрирует изменение приращения на каждом шаге выполнения цикла: : УДВАИВАНИЕ CR 32767 1 DO I . I +LODP ;

Здесь индекс непосредственно используется в качестве приращения. Начиная с единицы он всякий раз удваивается, как это показано ниже: УДВАИВАНИЕ

1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 ок

Если бы в этом примере аргумент для +LOOP принял хотя бы один раз значение 0, то мы никогда не вышли бы из цикла — получился бы так называемый бесконечный цикл1.


1 Для специалистов. Некоторые Форт-системы, созданные до принятия Стан-дарта-83, включают /LOOP, которое, как и +LOOP, выбирает из стека приращение, но оно должно быть положительным. Это может привести к тому, что индекс превысит значение 32767, скажем, при индексации по адресам или номерам блоков, так как указанные числа принимают только положительные значения в отличие от тех ситуаций, когда выполняются операции над числами со знаком. Слово 4- LOOP, удовлетворяющее Стандарту-83, снимает данную проблему.




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