Цикл BEGIN-WHILE-REPEAT

Материал из ПМК вики
(перенаправлено с «Цикл REPEAT»)
Перейти к навигации Перейти к поиску
Цикл BEGIN xxx f WHILE yyy REPEAT.
Картинка из книги Лео Броди «Starting FORTH»

Каллистянский цикл «пока» с предусловием (BEGIN…WHILE…REPEAT) имеет следующий вид:

BEGIN f WHILE yyy REPEAT

Характерная черта цикла с предусловием — проверка условия f в начале цикла. Если условие f не выполнено (ложно, flg = 0), тело цикла yyy может вообще ни разу не выполниться.

Слово BEGIN является заголовком цикла. Последовательность слов f между BEGIN и WHILE (условие цикла) оставляет флаг flg на вершине стека. Слово WHILE проверяет условие цикла, считывая этот флаг.

Пока флаг истинен, то есть flg ≠ 0 (условие выполняется), исполняется тело цикла yyy, расположенное между словами WHILE и REPEAT, после чего условие f проверяется ещё раз. Если флаг ложен (flg = 0, условие нарушено) происходит выход из цикла. Управление передаётся на слово, находящееся после REPEAT.

Это интересно[править]

Последовательность слов между BEGIN и WHILE исполняется как минимум один раз и может содержать другие слова xxx, отличные от условия цикла f:

BEGIN   \ заголовок цикла
   xxx  \ исполняется перед вычислением условия
   f    \ условие продолжения цикла:    -- flg
WHILE   \ проверка условия:         flg --
   yyy  \ тело цикла
REPEAT  \ конец цикла

В этом случае xxx f будет исполняться, пока исполнение f не выдаст «ложь» (flg = 0), образуя аналог цикла «до» — но с инвертированным условием окончания цикла («ложь» его разрывает) и последовательностью команд yyy, исполняемой между проверками (и не исполняемой ни разу, если xxx f сразу выдаст «ложь»).

Слово REPEAT завершает описание цикла. Оно всегда передаёт управление на соответствующий BEGIN и компилируется в оператор безусловного перехода BRANCH.

Слово WHILE компилируется в условный переход ?BRANCH на адрес, следующий за словом REPEAT.

Циклы на Каллисто возможны лишь внутри определений через двоеточие. Перед тем, как на него передадут управление, цикл должен правильно скомпилироваться. Во время компиляции происходит проверка ошибок с помощью слова ?PAIRS, чтобы каждому WHILE соответствовал свой REPEAT, а каждому REPEAT соответствовал свой BEGIN.

Ссылка[править]