Цикл BEGIN-UNTIL: различия между версиями
AtH (обсуждение | вклад) Нет описания правки |
AtH (обсуждение | вклад) Нет описания правки |
||
(не показаны 22 промежуточные версии этого же участника) | |||
Строка 1: | Строка 1: | ||
[[Файл:indefinite.gif|thumb|right|491px|Цикл BEGIN xxx f UNTIL всегда выполняется хотя бы 1 раз.<br>Картинка из книги Лео Броди «Starting FORTH»]] | [[Файл:indefinite.gif|thumb|right|491px|Цикл BEGIN xxx f UNTIL всегда выполняется хотя бы 1 раз.<br>Картинка из книги Лео Броди «Starting FORTH»]] | ||
''' | Каллистянский '''цикл «до» с постусловием''' (BEGIN…UNTIL) имеет следующий вид (xxx и f это последовательности слов Каллисто): | ||
BEGIN | BEGIN xxx f UNTIL | ||
xxx | |||
Подробней: | |||
BEGIN \ заголовок цикла | |||
xxx \ тело цикла | |||
f \ условие завершения цикла: -- flg | |||
UNTIL \ проверка условия: flg -- | |||
Отличительная особенность цикла «до» — проверка условия в конце тела цикла. Это означает, что цикл BEGIN…UNTIL всегда выполняется как минимум один раз. | Отличительная особенность цикла «до» — проверка условия в конце тела цикла. Это означает, что цикл BEGIN…UNTIL всегда выполняется как минимум один раз. | ||
Слово [[BEGIN]] является заголовком цикла. Последовательность | Слово [[BEGIN]] является заголовком цикла. Последовательность слов xxx f между [[BEGIN]] и [[UNTIL]] является телом цикла и может исполняться больше одного раза. Тело цикла xxx f завершается последовательностью команд f — условием цикла, оставляющим на вершине [[Стек данных|стека]] флаг flg. | ||
Слово [[UNTIL]] | Слово [[UNTIL]] снимает этот флаг со [[Стек данных|стека]] и осуществляет проверку условия цикла. Если этот флаг ложь, то есть flg = 0 (условие не выполнено), цикл повторяется. Как только условие начинает выполняться (флаг истина, flg ≠ 0), цикл прерывается. | ||
Если условие выполняется сразу, тело цикла будет выполнено ровно один раз. | Если условие выполняется сразу, тело цикла будет выполнено ровно один раз. | ||
Строка 16: | Строка 21: | ||
== Заметка == | == Заметка == | ||
Выделять на отдельной строчке условие f в теле цикла xxx f это хорошая, но необязательная практика программирования. Главное, чтобы после выполнения тела цикла на стеке | Выделять на отдельной строчке условие f в теле цикла xxx f это хорошая, но необязательная практика программирования. Флаг flg всегда проверяется в конце цикла, но может формироваться и в начале, и в середине цикла. Главное, чтобы после выполнения тела цикла этот флаг flg остался на вершине стеке. Только тогда этот флаг и проверит условный оператор [[?BRANCH]], в который компилируется слово [[UNTIL]]. | ||
Циклы на [[Каллисто]] возможны лишь внутри определений через двоеточие. Перед тем, как на него передадут управление, цикл должен правильно скомпилироваться. Во время компиляции происходит проверка ошибок с помощью слова [[?PAIR]], чтобы каждому [[UNTIL]] соответствовал свой [[BEGIN]]. | |||
== Ссылка == | == Ссылка == | ||
* [https://en.wikipedia.org/wiki/Do_while_loop Do while loop в английской Википедии] ''(англ.)'' | * [https://en.wikipedia.org/wiki/Do_while_loop Do while loop в английской Википедии] ''(англ.)'' | ||
* [http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20STARTING%20FORTH\06.ZIKLITESKIE%20STRUKTURY ЦИКЛИЧЕСКИЕ СТРУКТУРЫ] в книге [http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20STARTING%20FORTH Л.Броуди «Начальный курс программирования на языке Форт»] | |||
* [http://www.forth.com/starting-forth/sf6/sf6.html Throw It For a Loop] в книге [http://www.forth.com/starting-forth/ Leo Brodie Starting Forth] ''(англ.)'' | |||
[[Категория:Каллисто]] | [[Категория:Каллисто]] |
Текущая версия от 07:04, 22 июня 2016
Каллистянский цикл «до» с постусловием (BEGIN…UNTIL) имеет следующий вид (xxx и f это последовательности слов Каллисто):
BEGIN xxx f UNTIL
Подробней:
BEGIN \ заголовок цикла xxx \ тело цикла f \ условие завершения цикла: -- flg UNTIL \ проверка условия: flg --
Отличительная особенность цикла «до» — проверка условия в конце тела цикла. Это означает, что цикл BEGIN…UNTIL всегда выполняется как минимум один раз.
Слово BEGIN является заголовком цикла. Последовательность слов xxx f между BEGIN и UNTIL является телом цикла и может исполняться больше одного раза. Тело цикла xxx f завершается последовательностью команд f — условием цикла, оставляющим на вершине стека флаг flg.
Слово UNTIL снимает этот флаг со стека и осуществляет проверку условия цикла. Если этот флаг ложь, то есть flg = 0 (условие не выполнено), цикл повторяется. Как только условие начинает выполняться (флаг истина, flg ≠ 0), цикл прерывается.
Если условие выполняется сразу, тело цикла будет выполнено ровно один раз.
Заметка[править]
Выделять на отдельной строчке условие f в теле цикла xxx f это хорошая, но необязательная практика программирования. Флаг flg всегда проверяется в конце цикла, но может формироваться и в начале, и в середине цикла. Главное, чтобы после выполнения тела цикла этот флаг flg остался на вершине стеке. Только тогда этот флаг и проверит условный оператор ?BRANCH, в который компилируется слово UNTIL.
Циклы на Каллисто возможны лишь внутри определений через двоеточие. Перед тем, как на него передадут управление, цикл должен правильно скомпилироваться. Во время компиляции происходит проверка ошибок с помощью слова ?PAIR, чтобы каждому UNTIL соответствовал свой BEGIN.