Текущая версия |
Ваш текст |
Строка 1: |
Строка 1: |
| '''WHILE''' (пока) — стандартное слово [[Каллисто]]. Проверка предусловия в цикле «пока». | | '''WHILE''' — стандартное слово [[Каллисто]]. |
| WHILE ( ф −− ) Если ф ложен (ф=0), выйти из цикла BEGIN WHILE REPEAT.
| | |
| Ветвление "[[WHILE]]" в [[Цикл BEGIN-WHILE-REPEAT|цикле "BEGIN WHILE REPEAT"]] используется вместе со словами [[BEGIN]] и [[REPEAT]]: | | Ветвление "[[WHILE]]" в цикле "[[BEGIN]] [[WHILE]] [[REPEAT]]". |
| BEGIN условие WHILE тело-цикла REPEAT
| |
|
| |
|
| == Ввод слова WHILE ==
| |
| В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите клавиши [[Клавиша В↑|{{Серая клавиша|В↑}}]] [[Клавиша ПП|{{Чёрная клавиша|ПП}}]] [[Клавиша 7|{{Серая клавиша|7}}]] [[Клавиша -|{{Серая клавиша|−}}]] [[Клавиша ИП|{{Чёрная клавиша|ИП}}]]
| |
|
| |
|
| == WHILE в стандарте ANS Forth == | | == WHILE в стандарте ANS Forth == |
| <pre>
| |
| 6.1.2430 WHILE CORE | | 6.1.2430 WHILE CORE |
| Интерпретация: Семантика интерпретации для этого слова не определена. | | Интерпретация: Семантика интерпретации для этого слова не определена. |
Строка 25: |
Строка 21: |
| Типичное использование: | | Типичное использование: |
| : X ... BEGIN ... test WHILE ... REPEAT ... ; | | : X ... BEGIN ... test WHILE ... REPEAT ... ; |
| </pre>
| |
|
| |
|
| == История ==
| |
| В некоторых сверхкомпактных Фортах вместо слова WHILE используется слово [[IF]], т.к. их реализации похожи.
| |
|
| |
|
| === WHILE в предыдущем стандарте Forth-83 (англ.) ===
| | == WHILE в предыдущем стандарте Forth-83 (англ.) == |
| WHILE flag -- C,I,79 | | WHILE flag -- C,I,79 |
| sys1 -- sys2 (compiling) | | sys1 -- sys2 (compiling) |
Строка 43: |
Строка 36: |
| with its corresponding REPEAT . See: BEGIN | | with its corresponding REPEAT . See: BEGIN |
|
| |
|
| === WHILE в стандарте Forth-79 (англ.) ===
| | |
| | == WHILE в стандарте Forth-79 (англ.) == |
| WHILE flag -- I,C,149 | | WHILE flag -- I,C,149 |
| Used in the form: | | Used in the form: |
Строка 52: |
Строка 46: |
| after REPEAT, exiting the structure. | | after REPEAT, exiting the structure. |
|
| |
|
| === WHILE в fig-FORTH Release 1 glossary, май 1979 (англ.) ===
| | |
| <pre>
| | == WHILE в fig-FORTH Release 1 glossary, май 1979 (англ.) == |
| WHILE f --- (run-time) ad1 nl --- ad1 n1 ad2 n2 p,C2 | | WHILE f --- (run-time) ad1 nl --- ad1 n1 ad2 n2 p,C2 |
| Occurs in a colon-definition in the form: | | Occurs in a colon-definition in the form: |
Строка 65: |
Строка 59: |
| At compile time, WHILE emplaces (0BRANCH) and leaves ad2 of the | | At compile time, WHILE emplaces (0BRANCH) and leaves ad2 of the |
| reserved offset. The stack values will be resolved by REPEAT. | | reserved offset. The stack values will be resolved by REPEAT. |
| </pre>
| |
|
| |
| == Реализация ==
| |
| По количеству ключевых слов цикл с предусловием while() в языке Си кажется «самым простым», а в [[Каллисто]] тот же цикл WHILE — «самый громоздкий». Целых три ключевых слова: [[BEGIN]] WHILE [[REPEAT]].
| |
|
| |
| На самом деле число ключевых слов в [[Каллисто]] меньше, т.к. в Си этот цикл чаще всего использует операторные скобки { }. И это если не считать обязательных (), в которых заключена проверка условия цикла.
| |
|
| |
| На этапе компиляции WHILE может вызывать [[Авост приложения|авост]], сгенерировав ошибку времени компиляции.
| |
| <pre>
| |
| 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
| |
| </pre>
| |
| Реализации из SP-Forth 4.20:
| |
| <pre>
| |
| : WHILE \ 94
| |
| \ Интерпретация: семантика неопределена.
| |
| \ Компиляция: ( C: dest -- orig dest )
| |
| \ Положить позицию новой неразрешенной ссылки вперед orig на управляющий стек
| |
| \ под имеющимся dest. Добавить семантику времени выполнения, данную ниже, к
| |
| \ текущему определению. Семантика незавершена, пока orig и dest не разрешатся
| |
| \ (например, по REPEAT).
| |
| \ Время выполнения: ( x -- )
| |
| \ Если все биты x нулевые, продолжать выполнение с позиции, заданной
| |
| \ разрешением orig.
| |
| ?COMP [COMPILE] IF
| |
| 2SWAP
| |
| ; IMMEDIATE
| |
| </pre>
| |
| <pre>
| |
| : WHILE \ 94
| |
| ?COMP 0 TC-?BRANCH, >MARK 1
| |
| 2SWAP
| |
| ; IMMEDIATE
| |
| </pre>
| |
|
| |
| === Советская реализация ===
| |
| Юрий Семёнов приводит следующее определение слова 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|цикла BEGIN…WHILE…REPEAT]] в ядре ФОРТ-ЕС:
| | == Реализация WHILE == |
| <PRE>
| | Юрий Семёнов приводит следующее описание слова WHILE (стр. 65): |
| Экран номер 47
| | : WHILE IF ; IMMEDIATE |
| 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
| |
| </PRE>
| |
| Определение слова WHILE в FORTH ИТЭФ:
| |
| <PRE>
| |
| HEAD 305Q,'WHIL',305Q,WHILE,$COL ; WHILE
| |
| DW $IF,SEMI
| |
| </PRE>
| |
|
| |
|
| == Ссылка == | | == Ссылка == |
| * {{Исходник|WHILE|WHILE}} | | * [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.2430 Слово WHILE в стандарте ANS Forth] ''(англ.)'' и [http://forth.sourceforge.net/standard/dpans/dpansa6.htm#A.6.1.2430 комментарий к нему] ''(англ.)'' |
| * См. слова [[BEGIN]] и [[REPEAT]]
| | * [http://www.forth200x.org/documents/html/core.html#core:WHILE Слово WHILE в черновике Forth 200x] ''(англ.)'' и [http://www.forth200x.org/documents/html/rationale.html#rat:core:WHILE комментарий к нему] ''(англ.)'' |
| * См. также слова [[UNTIL]] и [[AGAIN]]
| |
| * Слово [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.2430 WHILE] и [http://forth.sourceforge.net/standard/dpans/dpansa6.htm#A.6.1.2430 комментарий к нему] в стандарте ANS Forth ''(англ.)''
| |
| * Слово [http://forth-standard.org/standard/core/WHILE WHILE] и [http://forth-standard.org/standard/rationale#rat:core:WHILE комментарий к нему] в черновике Forth 200x ''(англ.)'' | |
| * [https://en.wikipedia.org/wiki/While_loop While loop в английской Википедии] ''(англ.)'' | | * [https://en.wikipedia.org/wiki/While_loop 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] ''(англ.)''
| |
|
| |
|
|
| |
|
Строка 146: |
Строка 75: |
| {{заготовка}} | | {{заготовка}} |
| [[Категория:Слова Каллисто]] | | [[Категория:Слова Каллисто]] |
| [[Категория:Слова высокого уровня]]
| |
| [[Категория:Слова с признаком IMMEDIATE]]
| |
| [[Категория:Структуры управления Каллисто]] | | [[Категория:Структуры управления Каллисто]] |
| [[Категория:Слова, способные вызывать авост приложения]]
| |
| [[Категория:Компилирующие слова]]
| |
| [[Категория:Стандартные слова]]
| |
| [[Категория:1994 CORE]]
| |
| [[Категория:2012 CORE]]
| |