LEAVE: различия между версиями
AtH (обсуждение | вклад) |
AtH (обсуждение | вклад) |
||
(не показаны 33 промежуточные версии этого же участника) | |||
Строка 1: | Строка 1: | ||
'''LEAVE''' — стандартное слово [[Каллисто]]. | '''LEAVE''' (выйти) — стандартное слово [[Каллисто]]. Аварийный выход из цикла [[FOR]]. | ||
LEAVE ( −− ) Закончить исполнение цикла FOR. | |||
Досрочно и немедленно прерывает самый внутренний цикл [[FOR]] .. [[NEXT]]. Управление передаётся на слово, следующее после ближайшего [[NEXT]]. Обычно слово LEAVE используется изнутри [[IF|условного оператора]]. | |||
Чтобы покинуть сразу несколько вложенных циклов [[FOR]], используйте нужное число слов [[UNLOOP]] перед LEAVE. | |||
== Ввод слова LEAVE == | |||
В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите клавиши [[Клавиша -|{{Серая клавиша|−}}]] [[Клавиша ИП|{{Чёрная клавиша|ИП}}]] {{ШГ←}} [[Клавиша ↔|{{Серая клавиша|↔}}]] [[Клавиша ИП|{{Чёрная клавиша|ИП}}]] | |||
== LEAVE в стандарте ANS Forth == | == LEAVE в стандарте ANS Forth == | ||
<PRE> | |||
6.1.1760 LEAVE CORE | 6.1.1760 LEAVE CORE | ||
Интерпретация: Семантика интерпретации для этого слова не определена. | Интерпретация: Семантика интерпретации для этого слова не определена. | ||
Строка 21: | Строка 26: | ||
Типичное использование: | Типичное использование: | ||
: X ... DO ... IF ... LEAVE THEN ... LOOP ... ; | : X ... DO ... IF ... LEAVE THEN ... LOOP ... ; | ||
</PRE> | |||
== История == | |||
В отличии от Форта, каллистянское слово LEAVE не обладает [[IMMEDIATE|признаком немедленного исполнения]] и не является компилирующим. | |||
== LEAVE в предыдущем стандарте Forth-83 (англ.) == | Реализация слова LEAVE в fig-Форте приравнивала счётчик цикла DO…LOOP к его границе, в результате чего последующее слово LOOP не выполняло переход на очередной цикл DO. 16-битный цикл DO…LOOP тех времён имел изъян. Он не позволял сделать просмотр адресов на границе 32Кб, например 32760 10 TYPE выдавало ошибку. Это вынудило провести реформу цикла DO…LOOP. | ||
В круговом цикле на 64K (описанном у Баранова-Ноздрунова) старая реализация LEAVE перестала работать и стандарт Форта-83 утвердил новый вариант LEAVE (немедленно прерывающий цикл), как стандартный. Этот новый вариант и реализован в [[Каллисто]], где роль цикла DO выполняет более современный цикл [[FOR]] … [[NEXT]], взятый из {{colorForth}}. | |||
=== LEAVE в предыдущем стандарте Forth-83 (англ.) === | |||
LEAVE -- C,I,83 | LEAVE -- C,I,83 | ||
-- (compiling) | -- (compiling) | ||
Строка 36: | Строка 48: | ||
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 | ||
Строка 44: | Строка 55: | ||
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> | |||
== Ссылки == | == Ссылки == | ||
* [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.1760 | * {{Исходник|LEAVE|LEAVE}} | ||
* [http:// | * См. слова [[FOR]], [[NEXT]], [[UNLOOP]], [[Слово I|I]], [[Слово J|J]] и [[Слово K|K]] | ||
* Слово [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 ''(англ.)'' | |||
* Слово [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] ''(англ.)'' | |||
Строка 54: | Строка 132: | ||
{{заготовка}} | {{заготовка}} | ||
[[Категория:Слова Каллисто]] | [[Категория:Слова Каллисто]] | ||
[[Категория:Примитивы]] | |||
[[Категория:Структуры управления Каллисто]] | [[Категория:Структуры управления Каллисто]] | ||
[[Категория:Стандартные слова]] | |||
[[Категория:1994 CORE]] | |||
[[Категория:2012 CORE]] |
Текущая версия от 19:26, 13 ноября 2017
LEAVE (выйти) — стандартное слово Каллисто. Аварийный выход из цикла FOR.
LEAVE ( −− ) Закончить исполнение цикла FOR.
Досрочно и немедленно прерывает самый внутренний цикл FOR .. NEXT. Управление передаётся на слово, следующее после ближайшего NEXT. Обычно слово LEAVE используется изнутри условного оператора.
Чтобы покинуть сразу несколько вложенных циклов FOR, используйте нужное число слов UNLOOP перед LEAVE.
Ввод слова LEAVE[править]
В режиме ЛАТ последовательно нажмите клавиши − ИП ШГ← ↔ ИП
LEAVE в стандарте ANS Forth[править]
6.1.1760 LEAVE CORE Интерпретация: Семантика интерпретации для этого слова не определена. Выполнение: ( -- ) ( R: loop-sys -- ) Снимает текущие параметры управления циклом. Неопределенная ситуация существует, если они недоступны. Продолжает выполнение непосредственно вне самого внутреннего синтаксически окруженного DO ... LOOP или DO ... +LOOP. См.: 3.2.3.3 Стек возвратов, 6.1.0140 +LOOP, 6.1.1800 LOOP. A.6.1.1760 LEAVE Заметьте, что LEAVE немедленно завершает цикл. Никакие слова после LEAVE в пределах цикла не будут выполнены. Типичное использование: : X ... DO ... IF ... LEAVE THEN ... LOOP ... ;
История[править]
В отличии от Форта, каллистянское слово LEAVE не обладает признаком немедленного исполнения и не является компилирующим.
Реализация слова LEAVE в fig-Форте приравнивала счётчик цикла DO…LOOP к его границе, в результате чего последующее слово LOOP не выполняло переход на очередной цикл DO. 16-битный цикл DO…LOOP тех времён имел изъян. Он не позволял сделать просмотр адресов на границе 32Кб, например 32760 10 TYPE выдавало ошибку. Это вынудило провести реформу цикла DO…LOOP.
В круговом цикле на 64K (описанном у Баранова-Ноздрунова) старая реализация LEAVE перестала работать и стандарт Форта-83 утвердил новый вариант LEAVE (немедленно прерывающий цикл), как стандартный. Этот новый вариант и реализован в Каллисто, где роль цикла DO выполняет более современный цикл FOR … NEXT, взятый из colorForth.
LEAVE в предыдущем стандарте Forth-83 (англ.)[править]
LEAVE -- C,I,83 -- (compiling) Transfers execution to just beyond the next LOOP or +LOOP . The loop is terminated and loop control parameters are discarded. May only be used in the form: DO ... LEAVE ... LOOP or DO ... LEAVE ... +LOOP LEAVE may appear within other control structures which are nested within the do-loop structure. More than one LEAVE may appear within a do-loop. See: "9.3 Return Stack"
LEAVE в стандарте Forth-79 (англ.)[править]
LEAVE C,213 Force termination of a DO-LOOP at the next LOOP or +LOOP by setting the loop limit equal to the current value of the index. The index itself remains unchanged, and execution proceeds normally until the loop terminating word is 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.
Реализация[править]
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
Реализации из SP-Forth 4.20:
: LEAVE \ 94 \ Интерпретация: семантика неопределена. \ Выполнение: ( -- ) ( R: loop-sys -- ) \ Убрать текущие параметры цикла. Неопределенная ситуация возникает, если \ они недоступны. Продолжить выполнение сразу за самыми внутренними DO ... LOOP \ или DO ... +LOOP. ?COMP SetOP 0824648D , \ lea esp, 08 [esp] SetOP C3 C, \ ret ; IMMEDIATE
: LEAVE \ 94 ?COMP SetOP 0824648D , \ lea esp, 08 [esp] SetOP C3 C, \ ret ; IMMEDIATE
Советская реализация[править]
Слово LEAVE в ФОРТ-ЕС было примитивом. Вот его описание и определение:
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
В FORTH ИТЭФ слово LEAVE также было примитивом, вот его определение:
; ** Стек возвратов ** HEAD 205Q 'LEAV',305Q,LEAVE ; LEAVE MOV AX, [BP] MOV [BP]+2, AX NEXT
Ссылки[править]
- Исходный текст слова LEAVE в Каллисто Классик 1.0
- См. слова FOR, NEXT, UNLOOP, I, J и K
- Слово LEAVE и комментарий к нему в стандарте ANS Forth (англ.)
- Слово LEAVE и комментарий к нему в черновике Forth 200x (англ.)
- ЦИКЛИЧЕСКИЕ СТРУКТУРЫ в книге Л.Броуди «Начальный курс программирования на языке Форт»
- Throw It For a Loop в книге Leo Brodie Starting Forth (англ.)
У этой статьи нет иллюстраций. Вы можете помочь проекту, добавив их. |
Это заготовка статьи. Вы можете помочь проекту, дополнив её. |