THEN

Материал из ПМК вики
Версия от 19:21, 13 ноября 2017; AtH (обсуждение | вклад) (→‎Реализация)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигации Перейти к поиску

THEN (тогда, то) — стандартное слово Каллисто.

THEN           ( −− )                               Конец ветвления IF.
Пример работы слова THEN

Ввод слова THEN[править]

В режиме ЛАТ последовательно нажмите четыре клавиши  2   ПП   ИП   4 

THEN в стандарте ANS Forth[править]

 6.1.2270   THEN                                                            CORE
        Интерпретация: Семантика интерпретации для этого слова не определена.

        Компиляция: ( C: orig -- )
            Добавляет семантику времени-выполнения, данную ниже к текущему 
            определению. Разрешает ссылку вперед orig, используя адрес ячейки 
            добавленной семантики времени-выполнения.

        Время-выполнения: ( -- )
            Продолжает выполнение.

        См.: 6.1.1310 ELSE, 6.1.1700 IF.

 A.6.1.2270   THEN
 Типичное использование:
        : X ... test IF ... THEN ... ;
 или
        : X ... test IF ... ELSE ... THEN ... ;

История[править]

Слово THEN является одним из самых древних сохранившихся слов Форта.

Оно появилось в программе CURVE, написанной Чак Муром на Алголе для Burroughs B5500 в 1964 году (Национальная ускорительная лаборатория SLAC, Стэнфордский университет).

В 1970 году «условные операторы» (англ. Conditional statements) IF ELSE THEN были реализованы Чаком Муром для 2К×48бит версии Форта на Burroughs B-5500.

Следущий код B-5500 FORTH проверял вершину стека на истинность и дублировал её, если она истина (аналог ?DUP):

IF DUP THEN

В 1971-73 годах Чак Мур перенёс Форт на DEC PDP-11 в National Radio Astronomy Observatory (англ., Шарлотсвилл). Появился косвенный шитый код (англ. indirect-threaded code), который изменил структуры управления, включая IF … THEN. Они получили элегантную реализацию с адресами на стеке данных во время компиляции.

В некоторых старых Фортах слово THEN называлось ENDIF

В Форте-94 кроме IF … THEN слово THEN также употребляется в контексте безусловного перехода вперёд AHEAD … THEN

THEN в предыдущем стандарте Forth-83 (англ.)[править]

     THEN         --                            C,I,79
                  sys --   (compiling)
          Used in the form:
                  flag IF ... ELSE ... THEN
          or
                  flag IF ... THEN
          THEN is the point where execution continues after ELSE , or
          IF when no ELSE is present.  sys is balanced with its
          corresponding IF or ELSE .  See:  IF  ELSE

Пример реализации THEN из предыдущего стандарта Forth-83[править]

          : THEN   >RESOLVE  ; IMMEDIATE

THEN в стандарте Forth-79 (англ.)[править]

THEN                                         I,C,161
    Used in a colon-definition in the form:
         IF ... ELSE ... THEN   or
         IF ... THEN
    THEN  is  the point where execution resumes after ELSE  or  IF
    (when no ELSE is present).

THEN в fig-FORTH Release 1 glossary, май 1979 (англ.)[править]

THEN                                        P,CO,L0
       An alias for ENDIF.
ENDIF         addr  n  ---  (compile)       P,CO,L0
       Occurs in a colon-definition in form:
         IF ... ENDIF
         IF ... ELSE ... ENDIF
       At run-time, ENDIF serves only as the destination of a forward
       branch from IF or ELSE. It marks the conclusion of the conditional
       structure. THEN is another name for ENDIF. Both names are supported
       in fig-FORTH. See also IF and ELSE.
       At compile-time, ENDIF computes the forward branch offset from addr
       to HERE and stores it at addr. n is used for error tests.

Реализация[править]

На этапе компиляции THEN может вызывать авост.

3642 RGRESOLVE:      .DW HERE, LITP
3643                 .DB 39,17                       ; 10001
3644                 .DW SUB, SWAP, STORE, EXIT
…
3684 ;#THEN
3685 ; THEN           I ( −− )                               Конец ветвления IF.
3686 LTHEN:          .DB     84H
3687                 .TEXT   "THEN"
3688                 .DW     LBEGIN
3689 THEN:           .DW CALL
3690 RTHEN:          .DW TWO,QPAIR, BRAN,RGRESOLVE

Реализации из SP-Forth 4.20:

: THEN \ 94
\ Интерпретация: семантика неопределена.
\ Компиляция: ( C: orig -- )
\ Разрешить ссылку вперед orig, используя позицию семантики выполнения.
\ Добавить семантику времени выполнения, данную ниже, к текущему определению.
\ Время выполнения: ( -- )
\ Продолжить выполнение.
  ?COMP \ HERE TO :-SET
  >ORESOLVE
; IMMEDIATE
: THEN  ?COMP  TC>RESOLVE ; IMMEDIATE

Советская реализация[править]

Юрий Семёнов приводит следующее описание слова THEN (стр. 59):

 : THEN   ?COMP 2 ?PAIR HERE OVER - ↔ ! ; IMMEDIATE

У Баранова-Ноздрунова определение слова THEN выглядит так (стр. 58):

: THEN  ( A,1 ---> )   1 ?PAIRS  >RESOLVE  ; IMMEDIATE

Описание слова THEN и определение IF…ELSE…THEN в ядре ФОРТ-ЕС:

THEN     HK А,2-> /КОМПИЛЯЦИЯ/ КОНЕЦ ВЕТВЛЕНИЯ "IF"            47
             -> /ИСПОЛНЕНИЕ/

                      Экран номер 47
 ( 31.03.86   СТАНДАРТНЫЕ СТРУКТУРЫ УПРАВЛЕНИЯ )
 : IF      ?COMP  COMPILE ?BRANCH  >MARK  2 ;  IMMEDIATE
 : THEN    2 ?PAIRS  >RESOLVE ;                IMMEDIATE
 : ELSE    2 ?PAIRS  COMPILE BRANCH  >MARK
          SWAP  >RESOLVE  2 ;                  IMMEDIATE

Определение слова THEN в FORTH ИТЭФ:

             HEAD    304Q,'THE',316Q,THEN,$COL            ; THEN
             DW  QCOMP,TWO,QPAIR,HERE,OVER,SUB,SWAP,STORE,SEMI

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


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


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