EXIT: различия между версиями
AtH (обсуждение | вклад) |
AtH (обсуждение | вклад) |
||
Строка 108: | Строка 108: | ||
STATE @ IF POSTPONE ?LEAVE-MACRO POSTPONE EXIT ELSE | STATE @ IF POSTPONE ?LEAVE-MACRO POSTPONE EXIT ELSE | ||
?LEAVE-MACRO EXIT THEN ; ALSO FORTH IMMEDIATE PREVIOUS | ?LEAVE-MACRO EXIT THEN ; ALSO FORTH IMMEDIATE PREVIOUS | ||
</pre> | |||
<pre> | |||
: EXIT | |||
?SET SetOP 0xC3 C, OPT OPT_CLOSE ; IMMEDIATE | |||
</pre> | </pre> | ||
Версия от 19:14, 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:
: 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 (англ.)
У этой статьи нет иллюстраций. Вы можете помочь проекту, добавив их. |
Это заготовка статьи. Вы можете помочь проекту, дополнив её. |