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

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

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

Текущая версия Ваш текст
Строка 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}}
* См. также слово [[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-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 в английской Википедии] ''(англ.)''
* [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] ''(англ.)''
 


{{нет иллюстраций}}
{{нет иллюстраций}}
{{заготовка}}
{{заготовка}}
[[Категория:Слова Каллисто]]
[[Категория:Слова Каллисто]]
[[Категория:Примитивы]]
[[Категория:Структуры управления Каллисто]]
[[Категория:Структуры управления Каллисто]]
[[Категория:Стандартные слова]]
[[Категория:1994 CORE]]
[[Категория:2012 CORE]]
Пожалуйста, учтите, что любой ваш вклад в проект «ПМК вики» может быть отредактирован или удалён другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. Pmkwiki:Авторские права). НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!

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

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