Редактирование: EXIT

Перейти к навигации Перейти к поиску
Внимание: Вы не вошли в систему. Ваш IP-адрес будет общедоступен, если вы запишете какие-либо изменения. Если вы войдёте или создадите учётную запись, её имя будет использоваться вместо IP-адреса, наряду с другими преимуществами.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий ниже, чтобы убедиться, что это нужная вам правка, и запишите страницу ниже, чтобы отменить правку.

Текущая версия Ваш текст
Строка 1: Строка 1:
'''EXIT''' (выход) — стандартное слово [[Каллисто]].
'''EXIT''' — стандартное слово [[Каллисто]].
EXIT          ( −− )                              Закончить исполнение текущего определения.
Закончить исполнение текущего [[Слово :|определения]]. Это слово часто используется, но его имя в исходном тексте приложений встречается нечасто. Причина в том, что [[слово ;]] автоматически компилирует EXIT в конце каждого [[Слово :|определения]].


Слово [[FOR]] кладёт на [[Стек возвратов Каллисто|стек возвратов]] свою служебную информацию, поэтому для возврата из слова изнутри цикла [[FOR]] перед EXIT нужно употреблять слово [[UNLOOP]], по одному на каждый из вложенных циклов [[FOR]].
Закончить исполнение текущего определения.


== Ввод слова EXIT ==
В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите четыре клавиши [[Клавиша ИП|{{Чёрная клавиша|ИП}}]] [[Клавиша 0|{{Серая клавиша|0}}]] [[Клавиша 7|{{Серая клавиша|7}}]] [[Клавиша 2|{{Серая клавиша|2}}]]


== EXIT в стандарте ANS Forth ==
== EXIT в стандарте ANS Forth ==
<PRE>
  6.1.1380  EXIT                                                            CORE
  6.1.1380  EXIT                                                            CORE
         Интерпретация: Семантика интерпретации для этого слова не определена.
         Интерпретация: Семантика интерпретации для этого слова не определена.
Строка 23: Строка 18:
  Типичное использование:
  Типичное использование:
         : X ... test IF ... EXIT THEN ... ;
         : X ... test IF ... EXIT THEN ... ;
</PRE>


== История ==
Слово EXIT является одним из самых древних и устоявшихся в Форте. Оно появилось в 1966 году, когда Чак Мур, будучи гуру MCP на 5500, работал в Realtime Systems, Inc (RSI).


С начала стандартизации Форта в 1979 году слово EXIT входит во все стандарты языка Форт, включая черновик Форта-2012.
== EXIT в предыдущем стандарте Forth-83 (англ.) ==
 
=== 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,
Строка 40: Строка 30:
           ;  "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
Строка 46: Строка 37:
     DO...LOOP.
     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: Строка 47:
{{заготовка}}
{{заготовка}}
[[Категория:Слова Каллисто]]
[[Категория:Слова Каллисто]]
[[Категория:Примитивы]]
[[Категория:Структуры управления Каллисто]]
[[Категория:Структуры управления Каллисто]]
[[Категория:Стандартные слова]]
[[Категория:1994 CORE]]
[[Категория:2012 CORE]]
Пожалуйста, учтите, что любой ваш вклад в проект «ПМК вики» может быть отредактирован или удалён другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. Pmkwiki:Авторские права). НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!

В целях защиты вики от автоматического спама в правках просим вас решить следующую каптчу:

Отменить Справка по редактированию (в новом окне)
Источник — https://pmk.the-hacker.ru/EXIT