EXIT: различия между версиями
AtH (обсуждение | вклад) Нет описания правки |
AtH (обсуждение | вклад) |
||
(не показано 30 промежуточных версий этого же участника) | |||
Строка 1: | Строка 1: | ||
'''EXIT''' (выход) — стандартное слово [[Каллисто]]. | '''EXIT''' (выход) — стандартное слово [[Каллисто]]. | ||
EXIT ( −− ) Закончить исполнение текущего определения. | |||
Закончить исполнение текущего [[Слово :|определения]]. Это слово часто используется, но его имя в исходном тексте приложений встречается нечасто. Причина в том, что [[слово ;]] автоматически компилирует EXIT в конце каждого [[Слово :|определения]]. | |||
Слово [[FOR]] кладёт на [[Стек возвратов Каллисто|стек возвратов]] свою служебную информацию, поэтому для возврата из слова изнутри цикла [[FOR]] перед EXIT нужно употреблять слово [[UNLOOP]], по одному на каждый из вложенных циклов [[FOR]]. | |||
== Ввод слова EXIT == | == Ввод слова EXIT == | ||
В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите клавиши [[Клавиша ИП|{{Чёрная клавиша|ИП}}]] [[Клавиша 0|{{Серая клавиша|0}}]] [[Клавиша 7|{{Серая клавиша|7}}]] [[Клавиша 2|{{Серая клавиша|2}}]] | В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите четыре клавиши [[Клавиша ИП|{{Чёрная клавиша|ИП}}]] [[Клавиша 0|{{Серая клавиша|0}}]] [[Клавиша 7|{{Серая клавиша|7}}]] [[Клавиша 2|{{Серая клавиша|2}}]] | ||
== EXIT в стандарте ANS Forth == | == EXIT в стандарте ANS Forth == | ||
<PRE> | |||
6.1.1380 EXIT CORE | 6.1.1380 EXIT CORE | ||
Интерпретация: Семантика интерпретации для этого слова не определена. | Интерпретация: Семантика интерпретации для этого слова не определена. | ||
Строка 20: | Строка 23: | ||
Типичное использование: | Типичное использование: | ||
: X ... test IF ... EXIT THEN ... ; | : X ... test IF ... EXIT THEN ... ; | ||
</PRE> | |||
== История == | |||
Слово EXIT является одним из самых древних и устоявшихся в Форте. Оно появилось в 1966 году, когда Чак Мур, будучи гуру MCP на 5500, работал в Realtime Systems, Inc (RSI). | |||
== EXIT в предыдущем стандарте Forth-83 (англ.) == | С начала стандартизации Форта в 1979 году слово EXIT входит во все стандарты языка Форт, включая черновик Форта-2012. | ||
=== EXIT в предыдущем стандарте Forth-83 (англ.) === | |||
EXIT -- C,79 | EXIT -- C,79 | ||
Compiled within a colon definition such that when executed, | Compiled within a colon definition such that when executed, | ||
Строка 32: | Строка 40: | ||
; "stack, return" "9.3 Return Stack" | ; "stack, return" "9.3 Return Stack" | ||
=== EXIT в стандарте Forth-79 (англ.) === | |||
== EXIT в стандарте Forth-79 (англ.) == | |||
EXIT C,117 | EXIT C,117 | ||
When compiled within a colon-definition, terminate execution | When compiled within a colon-definition, terminate execution | ||
Строка 39: | Строка 46: | ||
DO...LOOP. | DO...LOOP. | ||
=== ;S в fig-FORTH Release 1 glossary, май 1979 (англ.) === | |||
== ;S в fig-FORTH Release 1 glossary, май 1979 (англ.) == | |||
;S P,L0 | ;S P,L0 | ||
Stop interpretation of a screen. | Stop interpretation of a screen. | ||
Строка 46: | Строка 52: | ||
colon-definition which returns execution to the calling proceedure. | colon-definition which returns execution to the calling proceedure. | ||
== Реализация == | |||
В [[Каллисто|Каллисто 1.0]] примитив EXIT тесно связан с остальным [[Адресный интерпретатор|адресным интерпретатором]], сложность которого вызвана необходимостью исполнять [[шитый код]] как из [[Регистры байтовых данных|области данных]], так и из [[Память программ|памяти программ]]: | |||
<pre> | |||
1768 ;#EXIT | |||
1769 ; EXIT ( −− ) Закончить исполнение текущего определения. | |||
1770 LEXIT: .DB 4 | |||
1771 .TEXT "EXIT" | |||
1772 .DW LRPSTO | |||
1773 EXIT: .DW RETURN ; При использовании EXIT внутри FOR .. NEXT нужно предварительно выполнить UNLOOP | |||
… | |||
2470 SETRIDAT: | |||
2471 M6 ; RI := RX | |||
2472 SETDAT: .NUMT RPUSHRID | |||
2473 MC ; RC := RPUSHRID ;∗∗ Следующий вызов −− из памяти данных | |||
2474 .NUM NEXTD | |||
2475 M9 ; R9 := NEXTD ;∗∗ | |||
2476 NEXTD: ; NEXT для шитого кода из памяти данных. | |||
2477 KRM6 RME ∗ KRM6 + M7 ; W := MEMW[RI++] считать шитый код | |||
2478 1 EE 4 − FX>=0 NEXTPP ; Слово из памяти программ? | |||
2479 NEXTDD: M7 M5 KRM7 RME ∗ KRM5 + ; Считать MEMW[W], это должно быть CFA очередного слова в шитом коде | |||
2480 M8 KGOTO8 ; передать управление на адрес, записанный в CFA | |||
2481 ; | |||
2482 RETURN: ; Обработчик EXIT | |||
2483 RM2 1 − M5 3 + M2 | |||
2484 KRM5 RME ∗ KRM5 + | |||
2485 PPM 9042 ; Регистр, увы, мучаем в любом случае | |||
2486 10001 − | |||
2487 FX<0 SETRIDAT | |||
2488 GOTO SETPRG | |||
… | |||
2495 SETPRG: .NUMT RPUSHRIP | |||
2496 MC ; RC := RPUSHRIP ;∗∗ Следующий вызов −− из памяти программ | |||
2497 .NUM NEXTP | |||
2498 M9 ; R9 := NEXTP ;∗∗ | |||
2499 NEXTP: ; NEXT для шитого кода из памяти программ. | |||
2500 PPRM 9044 RME ∗ PPRM 9044 + | |||
2501 DOEXECRX: M7 ; W := MEMW[RI++] считать шитый код | |||
2502 1 EE 4 − FX<0 NEXTDD ; Слово из области двоичных данных? | |||
2503 NEXTPP: RM7 KPRGM RME ∗ RM7 1 + KPRGM + ; Считать MEMW[W], это должно быть CFA очередного слова в шитом коде | |||
2504 M8 KGOTO8 ; передать управление на адрес, записанный в CFA | |||
</pre> | |||
Реализации из SP-Forth 4.20: | |||
<pre> | |||
: RET, ( -> ) \ скомпилировать инструкцию RET | |||
?SET SetOP 0xC3 C, OPT OPT_CLOSE | |||
; | |||
… | |||
: EXIT | |||
RET, | |||
; IMMEDIATE | |||
</pre> | |||
<pre> | |||
\ : EXIT ( REDEFINE EXIT TO TAKE CARE OF MACROS ) | |||
\ IN-MACRO? IF LEAVE-MACRO THEN R> DROP ; | |||
( REDEFINE EXIT TO BE CLOSER TO STANDARD ) | |||
: ?LEAVE-MACRO ( CONDITIONALLY UNNEST A MACRO ) | |||
IN-MACRO? IF LEAVE-MACRO THEN ; | |||
: EXIT ( REDEFINE EXIT TO TAKE CARE OF MACROS ) | |||
STATE @ IF POSTPONE ?LEAVE-MACRO POSTPONE EXIT ELSE | |||
?LEAVE-MACRO EXIT THEN ; ALSO FORTH IMMEDIATE PREVIOUS | |||
</pre> | |||
<pre> | |||
: EXIT | |||
?SET SetOP 0xC3 C, OPT OPT_CLOSE ; IMMEDIATE | |||
</pre> | |||
=== Советская реализация === | |||
Слово EXIT в ФОРТ-ЕС было [[примитив]]ом. Вот его описание и определение: | |||
<PRE> | |||
EXIT К -> ЗАКОНЧИТЬ ИСПОЛНЕНИЕ ТЕКУЩЕГО ОПРЕДЕЛЕНИЯ 4 | |||
EXIT# M ТОЧКА "EXIT" АДРЕСНОГО ИНТЕРПРЕТАТОРА 4 | |||
ЗНАЧЕНИИ В СТЕКЕ | |||
Экран номер 4 | |||
( 09.09.86 ВСПОМОГАТЕЛЬНЫЕ ПОДПРОГРАММЫ: ВОЗВРАТ В РЕГ.14) | |||
CODE EXIT | |||
M: EXIT# RI RPOP, RI RMASK NR, RNEXT BR, END-CODE | |||
</PRE> | |||
В FORTH ИТЭФ слово EXIT называлось ;S и также было [[примитив]]ом, вот его определение: | |||
<PRE> | |||
HEAD 202Q,';',323Q,SEMI ; ;S | |||
MOV SI, [BP] | |||
ADD BP, 2 | |||
NEXT | |||
</PRE> | |||
== Ссылки == | == Ссылки == | ||
* {{Исходник|EXIT|EXIT}} | |||
* См. также слово [[UNLOOP]] | |||
* Слово [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.1380 EXIT] и [http://forth.sourceforge.net/standard/dpans/dpansa6.htm#A.6.1.1380 комментарий к нему] в стандарте ANS Forth ''(англ.)'' | * Слово [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.1380 EXIT] и [http://forth.sourceforge.net/standard/dpans/dpansa6.htm#A.6.1.1380 комментарий к нему] в стандарте ANS Forth ''(англ.)'' | ||
* Слово [http:// | * Слово [http://forth-standard.org/standard/core/EXIT EXIT] и [http://forth-standard.org/standard/rationale#rat:core:EXIT комментарий к нему] в черновике Forth 200x ''(англ.)'' | ||
* [https://en.wikipedia.org/wiki/Return_statement Return statement в английской Википедии] ''(англ.)'' | * [https://en.wikipedia.org/wiki/Return_statement Return statement в английской Википедии] ''(англ.)'' | ||
* [http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20STARTING%20FORTH\09.FUNKZIONIROWANIE%20FORT-SISTEMY ФУНКЦИОНИРОВАНИЕ ФОРТ-СИСТЕМЫ] в книге [http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20STARTING%20FORTH Л.Броуди «Начальный курс программирования на языке Форт»] | |||
* [http://www.forth.com/starting-forth/sf9/sf9.html Under the Hood] в книге [http://www.forth.com/starting-forth/ Leo Brodie Starting Forth] ''(англ.)'' | |||
Строка 56: | Строка 154: | ||
{{заготовка}} | {{заготовка}} | ||
[[Категория:Слова Каллисто]] | [[Категория:Слова Каллисто]] | ||
[[Категория:Примитивы]] | |||
[[Категория:Структуры управления Каллисто]] | [[Категория:Структуры управления Каллисто]] | ||
[[Категория: | [[Категория:Стандартные слова]] | ||
[[Категория:1994 CORE]] | |||
[[Категория:2012 CORE]] |
Текущая версия от 23:51, 13 ноября 2017
EXIT (выход) — стандартное слово Каллисто.
EXIT ( −− ) Закончить исполнение текущего определения.
Закончить исполнение текущего определения. Это слово часто используется, но его имя в исходном тексте приложений встречается нечасто. Причина в том, что слово ; автоматически компилирует EXIT в конце каждого определения.
Слово FOR кладёт на стек возвратов свою служебную информацию, поэтому для возврата из слова изнутри цикла FOR перед EXIT нужно употреблять слово UNLOOP, по одному на каждый из вложенных циклов FOR.
Ввод слова EXIT[править]
В режиме ЛАТ последовательно нажмите четыре клавиши ИП 0 7 2
EXIT в стандарте ANS Forth[править]
6.1.1380 EXIT CORE Интерпретация: Семантика интерпретации для этого слова не определена. Выполнение: ( -- ) ( R: nest-sys -- ) Возвращает управление на вызывающее определение, определенное nest- sys. Перед выполнением EXIT в пределах do-loop, программа должна удалить параметры управления циклом, выполняя UNLOOP. См.: 3.2.3.3 Стек возвратов, 6.1.2380 UNLOOP. A.6.1.1380 EXIT Типичное использование: : X ... test IF ... EXIT THEN ... ;
История[править]
Слово EXIT является одним из самых древних и устоявшихся в Форте. Оно появилось в 1966 году, когда Чак Мур, будучи гуру MCP на 5500, работал в Realtime Systems, Inc (RSI).
С начала стандартизации Форта в 1979 году слово EXIT входит во все стандарты языка Форт, включая черновик Форта-2012.
EXIT в предыдущем стандарте Forth-83 (англ.)[править]
EXIT -- C,79 Compiled within a colon definition such that when executed, that colon definition returns control to the definition that passed control to it by returning control to the return point on the top of the return stack. An error condition exists if the top of the return stack does not contain a valid return point. May not be used within a do-loop. See: ; "stack, return" "9.3 Return Stack"
EXIT в стандарте Forth-79 (англ.)[править]
EXIT C,117 When compiled within a colon-definition, terminate execution of that definition, at that point. May not be used within a DO...LOOP.
;S в fig-FORTH Release 1 glossary, май 1979 (англ.)[править]
;S P,L0 Stop interpretation of a screen. ;S is also the run-time word compiled at the end of a colon-definition which returns execution to the calling proceedure.
Реализация[править]
В Каллисто 1.0 примитив EXIT тесно связан с остальным адресным интерпретатором, сложность которого вызвана необходимостью исполнять шитый код как из области данных, так и из памяти программ:
1768 ;#EXIT 1769 ; EXIT ( −− ) Закончить исполнение текущего определения. 1770 LEXIT: .DB 4 1771 .TEXT "EXIT" 1772 .DW LRPSTO 1773 EXIT: .DW RETURN ; При использовании EXIT внутри FOR .. NEXT нужно предварительно выполнить UNLOOP … 2470 SETRIDAT: 2471 M6 ; RI := RX 2472 SETDAT: .NUMT RPUSHRID 2473 MC ; RC := RPUSHRID ;∗∗ Следующий вызов −− из памяти данных 2474 .NUM NEXTD 2475 M9 ; R9 := NEXTD ;∗∗ 2476 NEXTD: ; NEXT для шитого кода из памяти данных. 2477 KRM6 RME ∗ KRM6 + M7 ; W := MEMW[RI++] считать шитый код 2478 1 EE 4 − FX>=0 NEXTPP ; Слово из памяти программ? 2479 NEXTDD: M7 M5 KRM7 RME ∗ KRM5 + ; Считать MEMW[W], это должно быть CFA очередного слова в шитом коде 2480 M8 KGOTO8 ; передать управление на адрес, записанный в CFA 2481 ; 2482 RETURN: ; Обработчик EXIT 2483 RM2 1 − M5 3 + M2 2484 KRM5 RME ∗ KRM5 + 2485 PPM 9042 ; Регистр, увы, мучаем в любом случае 2486 10001 − 2487 FX<0 SETRIDAT 2488 GOTO SETPRG … 2495 SETPRG: .NUMT RPUSHRIP 2496 MC ; RC := RPUSHRIP ;∗∗ Следующий вызов −− из памяти программ 2497 .NUM NEXTP 2498 M9 ; R9 := NEXTP ;∗∗ 2499 NEXTP: ; NEXT для шитого кода из памяти программ. 2500 PPRM 9044 RME ∗ PPRM 9044 + 2501 DOEXECRX: M7 ; W := MEMW[RI++] считать шитый код 2502 1 EE 4 − FX<0 NEXTDD ; Слово из области двоичных данных? 2503 NEXTPP: RM7 KPRGM RME ∗ RM7 1 + KPRGM + ; Считать MEMW[W], это должно быть CFA очередного слова в шитом коде 2504 M8 KGOTO8 ; передать управление на адрес, записанный в CFA
Реализации из SP-Forth 4.20:
: RET, ( -> ) \ скомпилировать инструкцию RET ?SET SetOP 0xC3 C, OPT OPT_CLOSE ; … : EXIT RET, ; IMMEDIATE
\ : EXIT ( REDEFINE EXIT TO TAKE CARE OF MACROS ) \ IN-MACRO? IF LEAVE-MACRO THEN R> DROP ; ( REDEFINE EXIT TO BE CLOSER TO STANDARD ) : ?LEAVE-MACRO ( CONDITIONALLY UNNEST A MACRO ) IN-MACRO? IF LEAVE-MACRO THEN ; : EXIT ( REDEFINE EXIT TO TAKE CARE OF MACROS ) STATE @ IF POSTPONE ?LEAVE-MACRO POSTPONE EXIT ELSE ?LEAVE-MACRO EXIT THEN ; ALSO FORTH IMMEDIATE PREVIOUS
: EXIT ?SET SetOP 0xC3 C, OPT OPT_CLOSE ; IMMEDIATE
Советская реализация[править]
Слово EXIT в ФОРТ-ЕС было примитивом. Вот его описание и определение:
EXIT К -> ЗАКОНЧИТЬ ИСПОЛНЕНИЕ ТЕКУЩЕГО ОПРЕДЕЛЕНИЯ 4 EXIT# M ТОЧКА "EXIT" АДРЕСНОГО ИНТЕРПРЕТАТОРА 4 ЗНАЧЕНИИ В СТЕКЕ Экран номер 4 ( 09.09.86 ВСПОМОГАТЕЛЬНЫЕ ПОДПРОГРАММЫ: ВОЗВРАТ В РЕГ.14) CODE EXIT M: EXIT# RI RPOP, RI RMASK NR, RNEXT BR, END-CODE
В FORTH ИТЭФ слово EXIT называлось ;S и также было примитивом, вот его определение:
HEAD 202Q,';',323Q,SEMI ; ;S MOV SI, [BP] ADD BP, 2 NEXT
Ссылки[править]
- Исходный текст слова EXIT в Каллисто Классик 1.0
- См. также слово UNLOOP
- Слово EXIT и комментарий к нему в стандарте ANS Forth (англ.)
- Слово EXIT и комментарий к нему в черновике Forth 200x (англ.)
- Return statement в английской Википедии (англ.)
- ФУНКЦИОНИРОВАНИЕ ФОРТ-СИСТЕМЫ в книге Л.Броуди «Начальный курс программирования на языке Форт»
- Under the Hood в книге Leo Brodie Starting Forth (англ.)
У этой статьи нет иллюстраций. Вы можете помочь проекту, добавив их. |
Это заготовка статьи. Вы можете помочь проекту, дополнив её. |