Формат вызова:
code forth
...
DO
...
...
LOOP
...
Перед словом DO на стек кладутся конечное и начальное значение цикла. Эти числа при выполнении слова DO снимаются со стека (и кладутся на стек возврата - но это в стандарте не оговаривается)
Тело цикла выполняется хотя бы один раз.
Слово LOOP увеличивает на единицу переменную цикла, сверяет с конечным значением, и если занчения точно равны - завершает цикл. Иначе - повторяется тело цикла.
Если изначально стартове значения равны, то цикл получается бесконечным (реально - до переполнения целочисленной переменной, до тех пор, пока переменная цикла и конечное значение не сравняются).
Для избегания зацикливания, при возможном наличии на входе равных переменных, есть слово ?DO - полный аналог DO, за исключением дополнительной проверки. Если числа на старте равны, то цикл не выполняется ни разу.
Для работы с шагом цикла отличным от +1 существует слово +LOOP
Ему на вход требуется положить на стек шаг цикла. Шаг цикла может быть и отрицательным. Значения в конце цикла не обязательно должны совпасть - выход из цикла осуществляется, когда пересекается граница конечного значения.
Считать переменную цикла можно словом I
code forth
: test
5 0 DO I . LOOP распечатает 0 1 2 3 4
0 0 ?DO I . LOOP ничего не делает
10 0 DO I . 2 +LOOP распечатает 0 2 4 6 8
10 0 DO I . 3 +LOOP распечатает 0 3 6 9
-10 0 DO I . -1 +LOOP распечатает 0 -1 -2 -3 -4 -5 -6 -7 -8 -9
;