Текущая версия |
Ваш текст |
Строка 1: |
Строка 1: |
| '''LEAVE''' (выйти) — стандартное слово [[Каллисто]]. Аварийный выход из цикла [[FOR]]. | | '''LEAVE''' — стандартное слово [[Каллисто]]. |
| LEAVE ( −− ) Закончить исполнение цикла FOR.
| |
| Досрочно и немедленно прерывает самый внутренний цикл [[FOR]] .. [[NEXT]]. Управление передаётся на слово, следующее после ближайшего [[NEXT]]. Обычно слово LEAVE используется изнутри [[IF|условного оператора]].
| |
|
| |
|
| Чтобы покинуть сразу несколько вложенных циклов [[FOR]], используйте нужное число слов [[UNLOOP]] перед LEAVE.
| | Досрочно прерывает цикл [[FOR]] .. [[NEXT]] (только для области данных) |
|
| |
|
| == Ввод слова LEAVE ==
| |
| В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите клавиши [[Клавиша -|{{Серая клавиша|−}}]] [[Клавиша ИП|{{Чёрная клавиша|ИП}}]] {{ШГ←}} [[Клавиша ↔|{{Серая клавиша|↔}}]] [[Клавиша ИП|{{Чёрная клавиша|ИП}}]]
| |
|
| |
|
| == LEAVE в стандарте ANS Forth == | | == LEAVE в стандарте ANS Forth == |
| <PRE>
| |
| 6.1.1760 LEAVE CORE | | 6.1.1760 LEAVE CORE |
| Интерпретация: Семантика интерпретации для этого слова не определена. | | Интерпретация: Семантика интерпретации для этого слова не определена. |
Строка 26: |
Строка 21: |
| Типичное использование: | | Типичное использование: |
| : X ... DO ... IF ... LEAVE THEN ... LOOP ... ; | | : X ... DO ... IF ... LEAVE THEN ... LOOP ... ; |
| </PRE>
| |
|
| |
|
| == История ==
| |
| В отличии от Форта, каллистянское слово LEAVE не обладает [[IMMEDIATE|признаком немедленного исполнения]] и не является компилирующим.
| |
|
| |
|
| Реализация слова LEAVE в fig-Форте приравнивала счётчик цикла DO…LOOP к его границе, в результате чего последующее слово LOOP не выполняло переход на очередной цикл DO. 16-битный цикл DO…LOOP тех времён имел изъян. Он не позволял сделать просмотр адресов на границе 32Кб, например 32760 10 TYPE выдавало ошибку. Это вынудило провести реформу цикла DO…LOOP.
| | == LEAVE в предыдущем стандарте Forth-83 (англ.) == |
| | |
| В круговом цикле на 64K (описанном у Баранова-Ноздрунова) старая реализация LEAVE перестала работать и стандарт Форта-83 утвердил новый вариант LEAVE (немедленно прерывающий цикл), как стандартный. Этот новый вариант и реализован в [[Каллисто]], где роль цикла DO выполняет более современный цикл [[FOR]] … [[NEXT]], взятый из {{colorForth}}.
| |
| | |
| === LEAVE в предыдущем стандарте Forth-83 (англ.) ===
| |
| LEAVE -- C,I,83 | | LEAVE -- C,I,83 |
| -- (compiling) | | -- (compiling) |
Строка 48: |
Строка 36: |
| may appear within a do-loop. See: "9.3 Return Stack" | | may appear within a do-loop. See: "9.3 Return Stack" |
|
| |
|
| === LEAVE в стандарте Forth-79 (англ.) ===
| | |
| | == LEAVE в стандарте Forth-79 (англ.) == |
| LEAVE C,213 | | LEAVE C,213 |
| Force termination of a DO-LOOP at the next LOOP or +LOOP by | | Force termination of a DO-LOOP at the next LOOP or +LOOP by |
Строка 55: |
Строка 44: |
| proceeds normally until the loop terminating word is | | proceeds normally until the loop terminating word is |
| encountered. | | encountered. |
|
| |
| === LEAVE в fig-FORTH Release 1 glossary, май 1979 (англ.) ===
| |
| LEAVE C,L0
| |
| Force termination of a DO-LOOP at the next opportunity by setting
| |
| the loop limit equal to the current value of the index. The index
| |
| itself remains unchanged, and execution proceeds normally until LOOP
| |
| or +LOOP is encountered.
| |
|
| |
| == Реализация ==
| |
| <pre>
| |
| 1775 ;#LEAVE
| |
| 1776 ; LEAVE ( −− ) Выйти из цикла FOR досрочно.
| |
| 1777 ; Досрочно прерывает цикл FOR .. NEXT (только для области данных)
| |
| 1778 ; В стандарте Форт−83 это слово IMMEDIATE −− в данной реализации Каллисто обычное.
| |
| 1779 LLEAVE: .DB 5
| |
| 1780 .TEXT "LEAVE"
| |
| 1781 .DW LEXIT
| |
| 1782 LEAVE: .DW JLEAVE
| |
| 1783 JLEAVE: RM2 1 + M5 3 + M2
| |
| 1784 KRM5 RME ∗ KRM5 + M6
| |
| 1785 KGOTO9
| |
| </pre>
| |
| Реализации из SP-Forth 4.20:
| |
| <pre>
| |
| : LEAVE \ 94
| |
| \ Интерпретация: семантика неопределена.
| |
| \ Выполнение: ( -- ) ( R: loop-sys -- )
| |
| \ Убрать текущие параметры цикла. Неопределенная ситуация возникает, если
| |
| \ они недоступны. Продолжить выполнение сразу за самыми внутренними DO ... LOOP
| |
| \ или DO ... +LOOP.
| |
| ?COMP
| |
| SetOP 0824648D , \ lea esp, 08 [esp]
| |
| SetOP C3 C, \ ret
| |
| ; IMMEDIATE
| |
| </pre>
| |
| <pre>
| |
| : LEAVE \ 94
| |
| ?COMP
| |
| SetOP 0824648D , \ lea esp, 08 [esp]
| |
| SetOP C3 C, \ ret
| |
| ; IMMEDIATE
| |
| </pre>
| |
|
| |
| === Советская реализация ===
| |
| Слово LEAVE в ФОРТ-ЕС было [[примитив]]ом. Вот его описание и определение:
| |
| <PRE>
| |
| LEAVE К -> ЗАКОНЧИТЬ ИСПОЛНЕНИЕ ЦИКЛА "DO" 24
| |
|
| |
| Экран номер 24
| |
| ( 09.09.86 ЦИКЛЫ СО СЧЕТЧИКОМ: (DO/ I I' J LEAVE)
| |
|
| |
| CODE LEAVE ( -> ) RI RFIRST 4 +(, LH, RI RMASK NR,
| |
| RRET 6 (, 0 RRET LA, RNEXT BR, END-CODE
| |
| </PRE>
| |
|
| |
| В FORTH ИТЭФ слово LEAVE также было [[примитив]]ом, вот его определение:
| |
| <PRE>
| |
| ; ** Стек возвратов **
| |
|
| |
| HEAD 205Q 'LEAV',305Q,LEAVE ; LEAVE
| |
| MOV AX, [BP]
| |
| MOV [BP]+2, AX
| |
| NEXT
| |
| </PRE>
| |
|
| |
|
| == Ссылки == | | == Ссылки == |
| * {{Исходник|LEAVE|LEAVE}} | | * [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.1760 Слово LEAVE в стандарте ANS Forth] ''(англ.)'' и [http://forth.sourceforge.net/standard/dpans/dpansa6.htm#A.6.1.1760 комментарий к нему] ''(англ.)'' |
| * См. слова [[FOR]], [[NEXT]], [[UNLOOP]], [[Слово I|I]], [[Слово J|J]] и [[Слово K|K]]
| | * [http://www.forth200x.org/documents/html/core.html#core:LEAVE Слово LEAVE в черновике Forth 200x] ''(англ.)'' и [http://www.forth200x.org/documents/html/rationale.html#rat:core:LEAVE комментарий к нему] ''(англ.)'' |
| * Слово [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.1760 LEAVE] и [http://forth.sourceforge.net/standard/dpans/dpansa6.htm#A.6.1.1760 комментарий к нему] в стандарте ANS Forth ''(англ.)''
| | * См. также слово [[UNLOOP]] |
| * Слово [http://forth-standard.org/standard/core/LEAVE LEAVE] и [http://forth-standard.org/standard/rationale#rat:core:LEAVE комментарий к нему] в черновике 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 Л.Броуди «Начальный курс программирования на языке Форт»]
| |
| * [http://www.forth.com/starting-forth/sf6/sf6.html Throw It For a Loop] в книге [http://www.forth.com/starting-forth/ Leo Brodie Starting Forth] ''(англ.)''
| |
|
| |
|
|
| |
|
Строка 132: |
Строка 54: |
| {{заготовка}} | | {{заготовка}} |
| [[Категория:Слова Каллисто]] | | [[Категория:Слова Каллисто]] |
| [[Категория:Примитивы]]
| |
| [[Категория:Структуры управления Каллисто]] | | [[Категория:Структуры управления Каллисто]] |
| [[Категория:Стандартные слова]]
| |
| [[Категория:1994 CORE]]
| |
| [[Категория:2012 CORE]]
| |