EXIT

Материал из ПМК вики
Перейти к навигации Перейти к поиску

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

Ссылки[править]


  Nopictures-icon.png У этой статьи нет иллюстраций. Вы можете помочь проекту, добавив их.


  Stub-icon-48px.png Это заготовка статьи. Вы можете помочь проекту, дополнив её.