WHILE
WHILE (пока) — стандартное слово Каллисто. Проверка предусловия в цикле «пока».
WHILE ( ф −− ) Если ф ложен (ф=0), выйти из цикла BEGIN WHILE REPEAT.
Ветвление "WHILE" в цикле "BEGIN WHILE REPEAT" используется вместе со словами BEGIN и REPEAT:
BEGIN условие WHILE тело-цикла REPEAT
Ввод слова WHILE[править]
В режиме ЛАТ последовательно нажмите клавиши В↑ ПП 7 − ИП
WHILE в стандарте ANS Forth[править]
6.1.2430 WHILE CORE Интерпретация: Семантика интерпретации для этого слова не определена. Компиляция: ( C: dest -- orig dest ) Помещает адрес ячейки новой неразрешенной ссылки вперед orig на стек потока управления, под существующим dest. Добавляет семантику времени-выполнения, данную ниже к текущему определению. Семантика не завершена до разрешения orig и dest (например, REPEAT). Время-выполнения: ( x -- ) Если все биты x нулевые, продолжает выполнение с адреса ячейки определенного ссылкой orig. A.6.1.2430 WHILE Типичное использование: : X ... BEGIN ... test WHILE ... REPEAT ... ;
История[править]
В некоторых сверхкомпактных Фортах вместо слова WHILE используется слово IF, т.к. их реализации похожи.
WHILE в предыдущем стандарте Forth-83 (англ.)[править]
WHILE flag -- C,I,79 sys1 -- sys2 (compiling) Used in the form: BEGIN ... flag WHILE ... REPEAT Selects conditional execution based on flag. When flag is true, execution continues to just after the WHILE through to the REPEAT which then continues execution back to just after the BEGIN . When flag is false, execution continues to just after the REPEAT , exiting the control structure. sys1 is balanced with its corresponding BEGIN . sys2 is balanced with its corresponding REPEAT . See: BEGIN
WHILE в стандарте Forth-79 (англ.)[править]
WHILE flag -- I,C,149 Used in the form: BEGIN ... flag WHILE ... REPEAT Select conditional execution based on flag. On a true flag, continue execution through to REPEAT, which then returns back to just after BEGIN. On a false flag, skip execution to just after REPEAT, exiting the structure.
WHILE в fig-FORTH Release 1 glossary, май 1979 (англ.)[править]
WHILE f --- (run-time) ad1 nl --- ad1 n1 ad2 n2 p,C2 Occurs in a colon-definition in the form: BEGIN ... WHILE (tp) ... REPEAT At run-time, WHILE selects conditional execution based on boolean flag f. If f is true (non-zero), WHILE continues execution of the true part thru to REPEAT, which then branches back to BEGIN. If f is false (zero), execution skips to just after REPEAT, exiting the structure. At compile time, WHILE emplaces (0BRANCH) and leaves ad2 of the reserved offset. The stack values will be resolved by REPEAT.
Реализация[править]
По количеству ключевых слов цикл с предусловием while() в языке Си кажется «самым простым», а в Каллисто тот же цикл WHILE — «самый громоздкий». Целых три ключевых слова: BEGIN WHILE REPEAT.
На самом деле число ключевых слов в Каллисто меньше, т.к. в Си этот цикл чаще всего использует операторные скобки { }. И это если не считать обязательных (), в которых заключена проверка условия цикла.
На этапе компиляции WHILE может вызывать авост, сгенерировав ошибку времени компиляции.
3705 RIF: .DW QCOMP, COMP,ZBRAND, GMARK, TWO, EXIT 3706 3707 ;#WHILE 3708 ; WHILE I ( ф −− ) Если ф ложен (ф=0), выйти из цикла BEGIN WHILE REPEAT. 3709 LWHILE: .DB 85H 3710 .TEXT "WHILE" ; ( флаг −− ) 3711 .DW LIF ; Ветвление "WHILE" в цикле "BEGIN WHILE REPEAT". 3712 WHILE: .DW CALL, ONE,QPAIR, ONE, BRAN,RIF
Реализации из SP-Forth 4.20:
: WHILE \ 94 \ Интерпретация: семантика неопределена. \ Компиляция: ( C: dest -- orig dest ) \ Положить позицию новой неразрешенной ссылки вперед orig на управляющий стек \ под имеющимся dest. Добавить семантику времени выполнения, данную ниже, к \ текущему определению. Семантика незавершена, пока orig и dest не разрешатся \ (например, по REPEAT). \ Время выполнения: ( x -- ) \ Если все биты x нулевые, продолжать выполнение с позиции, заданной \ разрешением orig. ?COMP [COMPILE] IF 2SWAP ; IMMEDIATE
: WHILE \ 94 ?COMP 0 TC-?BRANCH, >MARK 1 2SWAP ; IMMEDIATE
Советская реализация[править]
Юрий Семёнов приводит следующее определение слова WHILE (стр. 65):
: WHILE [COMPILE] IF ; IMMEDIATE
У Баранова-Ноздрунова определение слова WHILE выглядит так (стр. 58):
: WHILE ( A1,2 ---> A1,A2,3 ) 2 ?PAIRS COMPILE ?BRANCH >MARK 3 ; IMMEDIATE
Описание слово WHILE и определение цикла BEGIN…WHILE…REPEAT в ядре ФОРТ-ЕС:
Экран номер 47 WHILE HK 1->А,2 /КОМПИЛЯЦИЯ/ ВЕТВЛЕНИЕ "WHILE" В 47 F-> /ИСПОЛНЕНИЕ/ ЦИКЛЕ "BEGIN WHILE REPEAT" ( 31.03.86 СТАНДАРТНЫЕ СТРУКТУРЫ УПРАВЛЕНИЯ ) : BEGIN ?COMP <MARK 1 ; IMMEDIATE : WHILE 1 ?PAIRS 1 [COMPILE] IF ; IMMEDIATE : REPEAT >R >R [COMPILE] AGAIN R> R> [COMPILE] THEN ; IMMEDIATE
Определение слова WHILE в FORTH ИТЭФ:
HEAD 305Q,'WHIL',305Q,WHILE,$COL ; WHILE DW $IF,SEMI
Ссылка[править]
- Исходный текст слова WHILE в Каллисто Классик 1.0
- См. слова BEGIN и REPEAT
- См. также слова UNTIL и AGAIN
- Слово WHILE и комментарий к нему в стандарте ANS Forth (англ.)
- Слово WHILE и комментарий к нему в черновике Forth 200x (англ.)
- While loop в английской Википедии (англ.)
- ЦИКЛИЧЕСКИЕ СТРУКТУРЫ в книге Л.Броуди «Начальный курс программирования на языке Форт»
- Throw It For a Loop в книге Leo Brodie Starting Forth (англ.)
У этой статьи нет иллюстраций. Вы можете помочь проекту, добавив их. |
Это заготовка статьи. Вы можете помочь проекту, дополнив её. |