Текущая версия |
Ваш текст |
Строка 1: |
Строка 1: |
| '''UNTIL''' (до, пока не) — стандартное слово [[Каллисто]]. Проверка постусловия цикла «до». | | '''UNTIL''' — стандартное слово [[Каллисто]]. |
| UNTIL ( ф −− ) Если ф ложен (ф=0), повторить цикл BEGIN UNTIL ещё раз.
| |
| [[Файл:indefinite.gif|thumb|right|491px|Цикл BEGIN xxx f UNTIL всегда выполняется хотя бы 1 раз.<br>Картинка из книги Лео Броди «Starting FORTH»]]
| |
| Конец описания [[Цикл BEGIN-UNTIL|цикла "BEGIN UNTIL"]]. Используется вместе со словом [[BEGIN]]:
| |
| BEGIN тело-цикла условие UNTIL
| |
| | |
| == Ввод слова UNTIL ==
| |
| В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите белые клавиши [[Клавиша 3|{{Серая клавиша|3}}]] [[Клавиша 4|{{Серая клавиша|4}}]] [[Клавиша 2|{{Серая клавиша|2}}]] [[Клавиша 7|{{Серая клавиша|7}}]] [[Клавиша -|{{Серая клавиша|−}}]]
| |
| | |
| == UNTIL в стандарте ANS Forth ==
| |
| <pre>
| |
| 6.1.2390 UNTIL CORE
| |
| Интерпретация: Семантика интерпретации для этого слова не определена.
| |
| | |
| Компиляция: ( C: dest -- )
| |
| Добавляет семантику времени-выполнения, данную ниже к текущему
| |
| определению, разрешая ссылку назад dest.
| |
| | |
| Время-выполнения: ( x -- )
| |
| Если все биты x нулевые, продолжает выполнение с адреса ячейки
| |
| определенного dest.
| |
| | |
| См.: 6.1.0760 BEGIN.
| |
| | |
| A.6.1.2390 UNTIL
| |
| Типичное использование:
| |
| : X ... BEGIN ... test UNTIL ... ;
| |
| </pre>
| |
| | |
| == История ==
| |
| В 1968 году Чак Мур работал в Mohasco Industries, Inc ([https://en.wikipedia.org/wiki/Amsterdam_%28city%29,_New_York Amsterdam NY], ''англ.''). Первая версия интерпретатора, получившая название FORTH, заработала на миникомпьютере IBM 1130 с графическим дисплеем 2250 (16-битный процессор с ОЗУ 8К, дисководом, клавиатурой, принтером и ридером/панчером перфокарт). Первый FORTH знал слово UNTIL под именем END
| |
| | |
| Слово END, как синоним UNTIL, допускали Форт-83, Форт-79 и fig-Форт.
| |
| | |
| Создатель Форта Чак Мур признался, что заимствовал цикл BEGIN…UNTIL из языка Алгол.
| |
| | |
| === UNTIL в предыдущем стандарте Forth-83 (англ.) ===
| |
| UNTIL flag -- C,I,79
| |
| sys -- (compiling)
| |
| Used in the form:
| |
| BEGIN ... flag UNTIL
| |
| Marks the end of a BEGIN-UNTIL loop which will terminate
| |
| based on flag. If flag is true, the loop is terminated. If
| |
| flag is false, execution continues to just after the
| |
| corresponding BEGIN . sys is balanced with its
| |
| corresponding BEGIN . See: BEGIN
| |
| | |
| === UNTIL в стандарте Forth-79 (англ.) ===
| |
| UNTIL flag -- I,C,,237
| |
| Within a colon-definition, mark the end of a BEGIN-UNTIL loop,
| |
| which will terminate based on flag. If flag is true, the loop
| |
| is terminated. If flag is false, execution returns to the
| |
| first word after BEGIN. BEGIN-UNTIL structures may be nested.
| |
| | |
| === UNTIL в fig-FORTH Release 1 glossary, май 1979 (англ.) ===
| |
| UNTIL f --- (run-time) addr n --- (compile) P,C2,L0
| |
| Occurs within a colon-definition in the form:
| |
| BEGIN ... UNTIL
| |
| At run-time, UNTIL controls the conditional branch back to the
| |
| corresponding BEGIN. If f is false, execution returns to just after.
| |
| BEGIN;
| |
| if true, execution continues ahead.
| |
| | |
| At compile-time, UNTIL compiles (0BRANCH) and an offset from HERE to
| |
| addr. n is used for error tests.
| |
| | |
| == Реализация ==
| |
| На этапе компиляции UNTIL может вызывать [[Авост приложения|авост]].
| |
| <pre>
| |
| 3659 RLRESOLVE: .DW LITP
| |
| 3660 .DB 39,17 ; 10001
| |
| 3661 .DW SUB, BRAN,RCOMMA
| |
| 3662
| |
| 3663 ;#UNTIL
| |
| 3664 ; UNTIL I ( ф −− ) Если ф ложен (ф=0), повторить цикл BEGIN UNTIL ещё раз.
| |
| 3665 LUNTIL: .DB 85H
| |
| 3666 .TEXT "UNTIL" ; ( флаг −− )
| |
| 3667 .DW LLRESOLVE ; Конец цикла "BEGIN UNTIL".
| |
| 3668 UNTIL: .DW CALL, ONE,QPAIR, COMP,ZBRAND, BRAN,RLRESOLVE
| |
| </pre>
| |
| Реализации из SP-Forth 4.20:
| |
| <pre>
| |
| : UNTIL \ 94
| |
| \ Интерпретация: семантика неопределена.
| |
| \ Компиляция: ( C: dest -- )
| |
| \ Добавить семантику времени выполнения, данную ниже, к текущему определению.
| |
| \ Разрешить ссылку назад dest.
| |
| \ Время выполнения: ( x -- )
| |
| \ Если все биты x нулевые, продолжать выполнение с позиции, заданной dest.
| |
| ?COMP 3 <> IF -2004 THROW THEN \ ABORT" UNTIL без BEGIN !"
| |
| ?BRANCH,
| |
| 0xFFFFFF80 DP @ 4 - @ U<
| |
| IF DP @ 5 - W@ 0x3F0 + DP @ 6 - W! -4 ALLOT
| |
| THEN DP @ TO :-SET
| |
| ; IMMEDIATE
| |
| </pre>
| |
| <pre>
| |
| : UNTIL \ 94
| |
| ?COMP 3 <> IF -2004 THROW THEN \ ABORT" UNTIL без BEGIN !"
| |
| TC-?BRANCH,
| |
| 0xFFFFFF80 DP @ 4 - @ U<
| |
| IF DP @ 5 - W@ 0x3F0 + DP @ 6 - W! -4 ALLOT
| |
| THEN DP @ TO :-SET
| |
| ; IMMEDIATE
| |
| </pre>
| |
| | |
| === Советская реализация ===
| |
| Юрий Семёнов приводит следующее описание слова UNTIL (стр. 65):
| |
| : UNTIL 1 ?PAIR COMPILE ?BRANCH <RESOLVE ; IMMEDIATE
| |
| | |
| У Баранова-Ноздрунова определение слова UNTIL выглядит так (стр. 58):
| |
| : UNTIL ( A1,2 ---> ) 2 ?PAIRS
| |
| COMPILE ?BRANCH <RESOLVE ; IMMEDIATE
| |
| | |
| Описание слова UNTIL и определение [[Цикл BEGIN-UNTIL|цикла BEGIN…UNTIL]] в ядре ФОРТ-ЕС:
| |
| <pre>
| |
| UNTIL HK A,1-> /КОМПИЛЯЦИЯ/ КОНЕЦ ЦИКЛА "BEGIN UNTIL" 47
| |
| F-> /ИСПОЛНЕНИЕ/
| |
| | |
| Экран номер 47
| |
| ( 31.03.86 СТАНДАРТНЫЕ СТРУКТУРЫ УПРАВЛЕНИЯ )
| |
| : BEGIN ?COMP <MARK 1 ; IMMEDIATE
| |
| : UNTIL 1 ?PAIRS COMPILE ?BRANCH <RESOLVE ; IMMEDIATE
| |
| </pre>
| |
| Определение слова UNTIL в FORTH ИТЭФ:
| |
| <PRE>
| |
| HEAD 305Q,'UNTI',314Q,UNTIL,$COL ; UNTIL
| |
| DW ONE,QPAIR,COMP,ZBRAN,BACK,SEMI
| |
| </PRE>
| |
|
| |
|
| == Ссылка == | | == Ссылка == |
| * {{Исходник|UNTIL|UNTIL}} | | * [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.2390 Слово UNTIL в стандарте ANS Forth] ''(англ.)'' и [http://forth.sourceforge.net/standard/dpans/dpansa6.htm#A.6.1.2390 комментарии к нему] ''(англ.)'' |
| * См. слово [[BEGIN]]
| | * [http://www.forth200x.org/documents/html/core.html#core:UNTIL Слово UNTIL в черновике Forth 200x] ''(англ.)'' и [http://www.forth200x.org/documents/html/rationale.html#rat:core:UNTIL комментарий к нему] ''(англ.)'' |
| * См. также слова [[WHILE]] и [[REPEAT]]
| |
| * Слово [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.2390 UNTIL] и [http://forth.sourceforge.net/standard/dpans/dpansa6.htm#A.6.1.2390 комментарий к нему] в стандарте ANS Forth ''(англ.)''
| |
| * Слово [http://forth-standard.org/standard/core/UNTIL UNTIL] и [http://forth-standard.org/standard/rationale#rat:core:UNTIL комментарий к нему] в черновике Forth 200x ''(англ.)'' | |
| * [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 Л.Броуди «Начальный курс программирования на языке Форт»]
| |
| * [https://en.wikipedia.org/wiki/Do_while_loop Do while loop в английской Википедии] ''(англ.)'' | | * [https://en.wikipedia.org/wiki/Do_while_loop Do while loop в английской Википедии] ''(англ.)'' |
| * [http://www.forth.com/starting-forth/sf6/sf6.html Throw It For a Loop] в книге [http://www.forth.com/starting-forth/ Leo Brodie Starting Forth] ''(англ.)''
| |
|
| |
|
|
| |
|
| | {{нет иллюстраций}} |
| {{заготовка}} | | {{заготовка}} |
| [[Категория:Слова Каллисто]] | | [[Категория:Слова Каллисто]] |
| [[Категория:Слова высокого уровня]]
| |
| [[Категория:Слова с признаком IMMEDIATE]]
| |
| [[Категория:Структуры управления Каллисто]] | | [[Категория:Структуры управления Каллисто]] |
| [[Категория:Слова, способные вызывать авост приложения]]
| |
| [[Категория:Компилирующие слова]]
| |
| [[Категория:Стандартные слова]]
| |
| [[Категория:1994 CORE]]
| |
| [[Категория:2012 CORE]]
| |