Текущая версия |
Ваш текст |
Строка 1: |
Строка 1: |
| '''EXIT''' (выход) — стандартное слово [[Каллисто]]. | | '''EXIT''' — стандартное слово [[Каллисто]]. |
| EXIT ( −− ) Закончить исполнение текущего определения.
| |
| Закончить исполнение текущего [[Слово :|определения]]. Это слово часто используется, но его имя в исходном тексте приложений встречается нечасто. Причина в том, что [[слово ;]] автоматически компилирует EXIT в конце каждого [[Слово :|определения]].
| |
|
| |
|
| Слово [[FOR]] кладёт на [[Стек возвратов Каллисто|стек возвратов]] свою служебную информацию, поэтому для возврата из слова изнутри цикла [[FOR]] перед EXIT нужно употреблять слово [[UNLOOP]], по одному на каждый из вложенных циклов [[FOR]].
| |
|
| |
| == Ввод слова EXIT ==
| |
| В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите четыре клавиши [[Клавиша ИП|{{Чёрная клавиша|ИП}}]] [[Клавиша 0|{{Серая клавиша|0}}]] [[Клавиша 7|{{Серая клавиша|7}}]] [[Клавиша 2|{{Серая клавиша|2}}]]
| |
|
| |
| == EXIT в стандарте ANS Forth ==
| |
| <PRE>
| |
| 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 ... ;
| |
| </PRE>
| |
|
| |
| == История ==
| |
| Слово 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 тесно связан с остальным [[Адресный интерпретатор|адресным интерпретатором]], сложность которого вызвана необходимостью исполнять [[шитый код]] как из [[Регистры байтовых данных|области данных]], так и из [[Память программ|памяти программ]]:
| |
| <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}} | | * [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.1380 Слово EXIT в стандарте ANS Forth] ''(англ.)'' и [http://forth.sourceforge.net/standard/dpans/dpansa6.htm#A.6.1.1380 комментарий к нему] ''(англ.)'' |
| * См. также слово [[UNLOOP]]
| | * [http://www.forth200x.org/documents/html/core.html#core:EXIT Слово EXIT в черновике Forth 200x] ''(англ.)'' и [http://www.forth200x.org/documents/html/rationale.html#rat:core:EXIT комментарий к нему] ''(англ.)'' |
| * Слово [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-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] ''(англ.)''
| |
|
| |
|
|
| |
|
Строка 154: |
Строка 11: |
| {{заготовка}} | | {{заготовка}} |
| [[Категория:Слова Каллисто]] | | [[Категория:Слова Каллисто]] |
| [[Категория:Примитивы]]
| |
| [[Категория:Структуры управления Каллисто]] | | [[Категория:Структуры управления Каллисто]] |
| [[Категория:Стандартные слова]]
| |
| [[Категория:1994 CORE]]
| |
| [[Категория:2012 CORE]]
| |