Текущая версия |
Ваш текст |
Строка 1: |
Строка 1: |
| '''THEN''' (тогда, то) — стандартное слово [[Каллисто]]. | | '''THEN''' — стандартное слово [[Каллисто]]. |
| THEN ( −− ) Конец ветвления IF.
| | |
| [[Файл:CallistoIf.png|thumb|right|264px|Пример работы слова THEN]] | | Конец ветвления "[[IF]]". |
|
| |
|
| == Ввод слова THEN ==
| |
| В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите четыре клавиши [[Клавиша 2|{{Серая клавиша|2}}]] [[Клавиша ПП|{{Чёрная клавиша|ПП}}]] [[Клавиша ИП|{{Чёрная клавиша|ИП}}]] [[Клавиша 4|{{Серая клавиша|4}}]]
| |
|
| |
|
| == THEN в стандарте ANS Forth == | | == THEN в стандарте ANS Forth == |
| <pre>
| |
| 6.1.2270 THEN CORE | | 6.1.2270 THEN CORE |
| Интерпретация: Семантика интерпретации для этого слова не определена. | | Интерпретация: Семантика интерпретации для этого слова не определена. |
Строка 26: |
Строка 23: |
| или | | или |
| : 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
| |
|
| |
|
| В Форте-94 кроме IF … THEN слово THEN также употребляется в контексте безусловного перехода вперёд AHEAD … THEN
| |
|
| |
|
| === THEN в предыдущем стандарте Forth-83 (англ.) ===
| | == THEN в предыдущем стандарте Forth-83 (англ.) == |
| THEN -- C,I,79 | | THEN -- C,I,79 |
| sys -- (compiling) | | sys -- (compiling) |
Строка 55: |
Строка 36: |
| corresponding IF or ELSE . See: IF ELSE | | 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 может вызывать [[Авост приложения|авост]].
| |
| <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 (стр. 59):
| |
| : THEN ?COMP 2 ?PAIR HERE OVER - ↔ ! ; IMMEDIATE
| |
|
| |
| У Баранова-Ноздрунова определение слова THEN выглядит так (стр. 58):
| |
| : 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}} | | * [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.2270 Слово THEN в стандарте ANS Forth] ''(англ.)'' и [http://forth.sourceforge.net/standard/dpans/dpansa6.htm#A.6.1.2270 комментарий к нему] ''(англ.)'' |
| * См. слова [[IF]] и [[ELSE]], а также [[TRUE]] и [[FALSE]]
| | * [http://www.forth200x.org/documents/html/core.html#core:THEN Слово THEN в черновике Forth 200x] ''(англ.)'' и [http://www.forth200x.org/documents/html/rationale.html#rat:core:THEN комментарий к нему] ''(англ.)'' |
| * Слово [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-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] ''(англ.)''
| |
|
| |
|
|
| |
|
Строка 151: |
Строка 45: |
| {{заготовка}} | | {{заготовка}} |
| [[Категория:Слова Каллисто]] | | [[Категория:Слова Каллисто]] |
| [[Категория:Слова высокого уровня]]
| |
| [[Категория:Слова с признаком IMMEDIATE]]
| |
| [[Категория:Структуры управления Каллисто]] | | [[Категория:Структуры управления Каллисто]] |
| [[Категория:Слова, способные вызывать авост приложения]]
| |
| [[Категория:Компилирующие слова]]
| |
| [[Категория:Стандартные слова]]
| |
| [[Категория:1994 CORE]]
| |
| [[Категория:2012 CORE]]
| |