ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ ОПЕРАТОРА ЦИКЛА DO
Вы можете оставить в стеке какое-нибудь число, которое будет служить аргументом для некоторого объекта внутри оператора цикла. Например,: ПРОИЗВЕДЕНИЯ ( n ) CR 11 1 DO DUP I * . LOOP DROP ;
даст вам следующий результат: 7 ПРОИЗВЕДЕНИЯ 7 14 21 28 35 42 49 56 A3 70 ок
или 8 ПРОИЗВЕДЕНИЯ 8 16 24 32 40 48 56 64 72 80 ok
Здесь вы просто умножаете текущее значение индекса на n на каждом шаге цикла. Заметьте, что необходимо размножить число n с помощью DUP внутри цикла, чтобы его копия была всегда доступна и убрать это число посредством DROP посае выхода из цикла.
Существует несколько «хитрых» примеров работы со стеком внутри цикла DO. Рассмотрим их на примере начисления сложных процентов. При заданном начальном остатке, скажем 1000 дол. и норме процента, допустим 6%, требуется написать определение для создания и вывода на печать таблицы, приведенной ниже: 1000 6 СЛОЖНЫЕ-ПРОЦЕНТЫ Год 1 Сумма 1060 Год 2 Сумма 1124 Год 3 Сумма 1191 и т.д.
и т. д. на двадцать лет. Сначала мы загружаем слово R%, специфицированное в гл. 5, а затем создаем определение : СЛОЖНЫЕ-ПРОЦЕНТЫ ( вклад процент -- ) SWAP 21 1 DO CR ." Год " I . 3 SPACES 2DUP R% + DUP ." Сумма " . LOOP 2DROP ;
На каждом шаге выполнения цикла мы применяем операцию 2DUP и таким образом обеспечиваем значение текущего остатка и неизменной нормы процента для следующего шага. После выхода из цикла по окончании вычислений мы убираем эти значения с помощью операции 2DROP.
Индекс может выступать в качестве некоторого условия для оператора IF. С учетом этой возможности вы можете предпринимать конкретные действия только на определенных шагах цикла, например: : ПРЯМОУГОЛЬНИК 256 0 DО I 16 MOD 0= IF CR THEN ." *" LOOP ;
Слово ПРЯМОУГОЛЬНИК выведет на печать 256 звездочек, причем после каждой 16-й звездочки он будет осуществлять возврат каретки на вашем терминале. В результате вы получите **************** **************** **************** **************** **************** **************** **************** **************** **************** **************** **************** **************** **************** **************** **************** ****************