THEN: различия между версиями

Материал из ПМК вики
Перейти к навигации Перейти к поиску
Нет описания правки
 
(не показано 26 промежуточных версий этого же участника)
Строка 1: Строка 1:
'''THEN''' (тогда, то) — стандартное слово [[Каллисто]].
THEN          ( −− )                              Конец ветвления IF.
[[Файл:CallistoIf.png|thumb|right|264px|Пример работы слова THEN]]
[[Файл:CallistoIf.png|thumb|right|264px|Пример работы слова THEN]]
'''THEN''' (тогда, то) — стандартное слово [[Каллисто]].
Конец ветвления "[[IF]]".


== Ввод слова THEN ==
== Ввод слова THEN ==
Строка 8: Строка 7:


== THEN в стандарте ANS Forth ==
== THEN в стандарте ANS Forth ==
<pre>
  6.1.2270  THEN                                                            CORE
  6.1.2270  THEN                                                            CORE
         Интерпретация: Семантика интерпретации для этого слова не определена.
         Интерпретация: Семантика интерпретации для этого слова не определена.
Строка 26: Строка 26:
  или
  или
         : X ... test IF ... ELSE ... THEN ... ;
         : X ... test IF ... ELSE ... THEN ... ;
</pre>
== История ==
Слово THEN является одним из самых древних сохранившихся слов Форта.
Оно появилось в программе CURVE, написанной Чак Муром на Алголе для Burroughs B5500 в 1964 году ([https://ru.wikipedia.org/wiki/%D0%9D%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%83%D1%81%D0%BA%D0%BE%D1%80%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%BB%D0%B0%D0%B1%D0%BE%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%B8%D1%8F_SLAC Национальная ускорительная лаборатория SLAC], [https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%8D%D0%BD%D1%84%D0%BE%D1%80%D0%B4%D1%81%D0%BA%D0%B8%D0%B9_%D1%83%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D1%82%D0%B5%D1%82 Стэнфордский университет]).
В 1970 году «условные операторы» (''англ.'' Conditional statements) IF ELSE THEN были реализованы Чаком Муром для 2К×48бит версии Форта на Burroughs B-5500.
Следущий код B-5500 FORTH проверял вершину стека на истинность и дублировал её, если она истина (аналог [[?DUP]]):
IF DUP THEN
В 1971-73 годах Чак Мур перенёс Форт на DEC PDP-11 в [https://en.wikipedia.org/wiki/National_Radio_Astronomy_Observatory National Radio Astronomy Observatory] (''англ.'', [https://ru.wikipedia.org/wiki/%D0%A8%D0%B0%D1%80%D0%BB%D0%BE%D1%82%D1%81%D0%B2%D0%B8%D0%BB%D0%BB_%28%D0%92%D0%B8%D1%80%D0%B3%D0%B8%D0%BD%D0%B8%D1%8F%29 Шарлотсвилл]). Появился ''косвенный шитый код'' (''англ.'' indirect-threaded code), который изменил структуры управления, включая IF … THEN. Они получили элегантную реализацию с адресами на [[Стек данных|стеке данных]] во время компиляции.
В некоторых старых Фортах слово THEN называлось ENDIF


== THEN в предыдущем стандарте Forth-83 (англ.) ==
В Форте-94 кроме IF … THEN слово THEN также употребляется в контексте безусловного перехода вперёд AHEAD … THEN
 
=== THEN в предыдущем стандарте Forth-83 (англ.) ===
       THEN        --                            C,I,79
       THEN        --                            C,I,79
                   sys --  (compiling)
                   sys --  (compiling)
Строка 38: Строка 55:
           corresponding IF or ELSE .  See:  IF  ELSE
           corresponding IF or ELSE .  See:  IF  ELSE


== Пример реализации THEN из предыдущего стандарта Forth-83 ==
=== Пример реализации THEN из предыдущего стандарта Forth-83 ===
           : THEN  >RESOLVE  ; IMMEDIATE
           : THEN  >RESOLVE  ; IMMEDIATE


== THEN в стандарте Forth-79 (англ.) ==
=== THEN в стандарте Forth-79 (англ.) ===
  THEN                                        I,C,161
  THEN                                        I,C,161
     Used in a colon-definition in the form:
     Used in a colon-definition in the form:
Строка 49: Строка 66:
     (when no ELSE is present).
     (when no ELSE is present).


== THEN в fig-FORTH Release 1 glossary, май 1979 (англ.) ==
=== THEN в fig-FORTH Release 1 glossary, май 1979 (англ.) ===
  THEN                                        P,CO,L0
  THEN                                        P,CO,L0
         An alias for ENDIF.
         An alias for ENDIF.
Строка 65: Строка 82:
         to HERE and stores it at addr. n is used for error tests.
         to HERE and stores it at addr. n is used for error tests.


== История ==
== Реализация ==
Слово THEN является одним из самых древних сохранившихся слов Форта. «Условные операторы» (''англ.'' Conditional statements) IF ELSE THEN были реализованы Чаком Муром для 2Кб версии B-5500 FORTH в 1970 году.
На этапе компиляции THEN может вызывать [[Авост приложения|авост]].
<pre>
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
</pre>
Реализации из SP-Forth 4.20:
<pre>
: THEN \ 94
\ Интерпретация: семантика неопределена.
\ Компиляция: ( C: orig -- )
\ Разрешить ссылку вперед orig, используя позицию семантики выполнения.
\ Добавить семантику времени выполнения, данную ниже, к текущему определению.
\ Время выполнения: ( -- )
\ Продолжить выполнение.
  ?COMP \ HERE TO :-SET
  >ORESOLVE
; IMMEDIATE
</pre>
<pre>
: THEN  ?COMP  TC>RESOLVE ; IMMEDIATE
</pre>


== Реализация THEN ==
=== Советская реализация ===
Юрий Семёнов приводит следующее описание слова THEN (стр. 59):
Юрий Семёнов приводит следующее описание слова THEN (стр. 59):
   : THEN  ?COMP 2 ?PAIR HERE OVER - ↔ ! ; IMMEDIATE
   : THEN  ?COMP 2 ?PAIR HERE OVER - ↔ ! ; IMMEDIATE
Строка 74: Строка 120:
У Баранова-Ноздрунова определение слова THEN выглядит так (стр. 58):
У Баранова-Ноздрунова определение слова THEN выглядит так (стр. 58):
  : THEN  ( A,1 ---> )  1 ?PAIRS  >RESOLVE  ; IMMEDIATE
  : THEN  ( A,1 ---> )  1 ?PAIRS  >RESOLVE  ; IMMEDIATE
Описание слова THEN и определение IF…ELSE…THEN в ядре ФОРТ-ЕС:
<pre>
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
</pre>
Определение слова THEN в FORTH ИТЭФ:
<PRE>
            HEAD    304Q,'THE',316Q,THEN,$COL            ; THEN
            DW  QCOMP,TWO,QPAIR,HERE,OVER,SUB,SWAP,STORE,SEMI
</PRE>


== Ссылки ==
== Ссылки ==
* {{Исходник|THEN|THEN}}
* См. слова [[IF]] и [[ELSE]], а также [[TRUE]] и [[FALSE]]
* Слово [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.2270 THEN] и [http://forth.sourceforge.net/standard/dpans/dpansa6.htm#A.6.1.2270 комментарий к нему] в стандарте ANS Forth ''(англ.)''
* Слово [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.2270 THEN] и [http://forth.sourceforge.net/standard/dpans/dpansa6.htm#A.6.1.2270 комментарий к нему] в стандарте ANS Forth ''(англ.)''
* Слово [http://www.forth200x.org/documents/html3/core/THEN.html THEN] и [http://www.forth200x.org/documents/html3/rationale.html#rat:core:THEN комментарий к нему] в черновике Forth 200x ''(англ.)''
* Слово [http://forth-standard.org/standard/core/THEN THEN] и [http://forth-standard.org/standard/rationale#rat:core:THEN комментарий к нему] в черновике Forth 200x ''(англ.)''
* [http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20STARTING%20FORTH\04.%20KOMPJUTER%20%22PRINIMAET%20RESENIA%22 КОМПЬЮТЕР "ПРИНИМАЕТ РЕШЕНИЯ"] в книге [http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20STARTING%20FORTH Л.Броуди «Начальный курс программирования на языке Форт»]
* [http://www.forth.com/starting-forth/sf4/sf4.html Decisions, Decisions…] в книге [http://www.forth.com/starting-forth/ Leo Brodie Starting Forth] ''(англ.)''




Строка 86: Строка 154:
[[Категория:Слова с признаком IMMEDIATE]]
[[Категория:Слова с признаком IMMEDIATE]]
[[Категория:Структуры управления Каллисто]]
[[Категория:Структуры управления Каллисто]]
[[Категория:Слова Каллисто без стековых диаграмм]]
[[Категория:Слова, способные вызывать авост приложения]]
[[Категория:Компилирующие слова]]
[[Категория:Стандартные слова]]
[[Категория:1994 CORE]]
[[Категория:2012 CORE]]

Текущая версия от 19:21, 13 ноября 2017

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

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


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


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