Текущая версия |
Ваш текст |
Строка 1: |
Строка 1: |
| '''ELSE''' (иначе) — стандартное слово [[Каллисто]]. | | '''ELSE''' — стандартное слово [[Каллисто]]. |
| ELSE ( −− ) Начало второй ветви ветвления IF.
| | |
| [[Файл:CallistoIf.png|thumb|right|264px|Пример работы слова ELSE]] | | Начало 2-ой ветви ветвления "[[IF]]". |
|
| |
|
| == Ввод слова ELSE ==
| |
| В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите четыре клавиши [[Клавиша ИП|{{Чёрная клавиша|ИП}}]] [[Клавиша -|{{Серая клавиша|−}}]] [[Клавиша 1|{{Серая клавиша|1}}]] [[Клавиша ИП|{{Чёрная клавиша|ИП}}]]
| |
|
| |
|
| == ELSE в стандарте ANS Forth == | | == ELSE в стандарте ANS Forth == |
| <pre>
| |
| 6.1.1310 ELSE CORE | | 6.1.1310 ELSE CORE |
| Интерпретация: Семантика интерпретации для этого слова не определена. | | Интерпретация: Семантика интерпретации для этого слова не определена. |
Строка 27: |
Строка 24: |
| Типичное использование: | | Типичное использование: |
| : X ... test IF ... ELSE ... THEN ; | | : X ... test IF ... ELSE ... THEN ; |
| </pre>
| |
|
| |
|
| == История ==
| |
| Слово ELSE является одним из самых древних слов Форта.
| |
|
| |
|
| Впервые слово ELSE появилось в программе 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 Стэнфордский университет]).
| | == ELSE в предыдущем стандарте Forth-83 (англ.) == |
| | |
| Необычный постфиксный условный оператор восходит к 1964 году:
| |
| Алгол — IF выражение THEN истина ELSE ложь
| |
| CURVE — стек IF истина ELSE ложь THEN
| |
| | |
| Истина интерпретировалась, если на стеке был не-нуль. THEN предлагал уникальное завершение, отсутствие которого в Алголе всегда вводило в замешательство Чака Мура. Такие выражения интерпретировались: IF сканировал вперёд до ELSE или THEN.
| |
| | |
| В 1970 году «условные операторы» (''англ.'' Conditional statements) IF ELSE THEN были реализованы Чаком Муром для 2К×48бит версии Форта на Burroughs B-5500.
| |
| | |
| В {{colorForth}} исключён ELSE и при необходимости рекомендуется использовать ; внутри IF…THEN :
| |
| IF … ; THEN
| |
| | |
| === ELSE в предыдущем стандарте Forth-83 (англ.) ===
| |
| ELSE -- C,I,79 | | ELSE -- C,I,79 |
| sys1 -- sys2 (compiling) | | sys1 -- sys2 (compiling) |
Строка 55: |
Строка 36: |
| its corresponding THEN . See: IF THEN | | its corresponding THEN . See: IF THEN |
|
| |
|
| === ELSE в стандарте Forth-79 (англ.) ===
| | |
| | == ELSE в стандарте Forth-79 (англ.) == |
| ELSE -- I,C,167 | | ELSE -- I,C,167 |
| Used in a colon-definition in the form: | | Used in a colon-definition in the form: |
Строка 63: |
Строка 45: |
| the stack. (see IF) | | the stack. (see IF) |
|
| |
|
| === ELSE в fig-FORTH Release 1 glossary, май 1979 (англ.) ===
| | |
| <pre>
| | == ELSE в fig-FORTH Release 1 glossary, май 1979 (англ.) == |
| ELSE addr1 n1 --- addr2 n2 (compiling) P,C2,L0 | | ELSE addr1 n1 --- addr2 n2 (compiling) P,C2,L0 |
| Occurs within a colon-definition in the form: | | Occurs within a colon-definition in the form: |
Строка 76: |
Строка 58: |
| resolves the pending forward branch from IF by calculating the | | resolves the pending forward branch from IF by calculating the |
| offset from addr1 to HERE and storing at addr1. | | offset from addr1 to HERE and storing at addr1. |
| </pre>
| |
|
| |
|
| == Реализация ==
| |
| На этапе компиляции ELSE может вызывать [[Авост приложения|авост]].
| |
| <pre>
| |
| 3692 ;#ELSE
| |
| 3693 ; ELSE I ( −− ) Начало второй ветви ветвления IF.
| |
| 3694 LELSE: .DB 84H
| |
| 3695 .TEXT "ELSE"
| |
| 3696 .DW LTHEN
| |
| 3697 SELSE: .DW CALL, TWO,QPAIR, COMP,BRAND, GMARK, SWAP, GRESOLVE, TWO, EXIT
| |
| </pre>
| |
| Реализации из SP-Forth 4.20:
| |
| <pre>
| |
| : ELSE \ 94
| |
| \ Интерпретация: семантика неопределена.
| |
| \ Компиляция: ( C: orig1 -- orig2 )
| |
| \ Положить на управляющий стек позицию новой неразрешенной ссылки вперед orig2.
| |
| \ Добавить семантику времени выполнения, данную ниже, к текущему определению.
| |
| \ Семантика незавершена, пока orig2 не разрешится (например, по THEN).
| |
| \ Разрешить ссылку вперед orig1, используя позицию следующей добавленной
| |
| \ семантики выполнения.
| |
| \ Время выполнения: ( -- )
| |
| \ Продолжить выполнение с позиции, заданной разрешением orig2.
| |
| ?COMP 0 BRANCH,
| |
| >ORESOLVE
| |
| >MARK 2
| |
| ; IMMEDIATE
| |
| </pre>
| |
| <pre>
| |
| : ELSE
| |
| ?COMP 0 TC-BRANCH,
| |
| TC>RESOLVE
| |
| >MARK 2
| |
| ; IMMEDIATE
| |
| </pre>
| |
|
| |
|
| === Советская реализация === | | == Реализация ELSE == |
| У Баранова-Ноздрунова определение слова ELSE выглядит так (стр. 58): | | У Баранова-Ноздрунова определение слова THEN выглядит так (стр. 58): |
| : ELSE ( A1,1 ---> A2,1 ) 1 ?PAIRS COMPILE BRANCH | | : ELSE ( A1,1 ---> A2,1 ) 1 ?PAIRS COMPILE BRANCH |
| >MARK ↔ >RESOLVE 1 ; IMMEDIATE | | >MARK ↔ >RESOLVE 1 ; IMMEDIATE |
|
| |
|
| Описание ELSE и определение IF…ELSE…THEN в ядре ФОРТ-ЕС:
| |
| <pre>
| |
| ELSE HK A1,2->A2,2 /КОМПИЛЯЦИЯ/ НАЧАЛО 2-ОЙ ВЕТВИ 47
| |
| -> /ИСПОЛНЕНИЕ/ ВЕТВЛЕНИЯ "IF"
| |
|
| |
| Экран номер 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>
| |
| Определение слова ELSE в FORTH ИТЭФ:
| |
| <PRE>
| |
| HEAD 304Q,'ELS',305Q,$ELSE,$COL ; ELSE
| |
| DW TWO,QPAIR,COMP,BRAN,HERE,ZERO,COMMA
| |
| DW SWAP,TWO,THEM,TWO,SEMI
| |
| </PRE>
| |
|
| |
|
| == Ссылки == | | == Ссылки == |
| * {{Исходник|ELSE|ELSE}} | | * [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.1310 Слово ELSE в стандарте ANS Forth] ''(англ.)'' и [http://forth.sourceforge.net/standard/dpans/dpansa6.htm#A.6.1.1310 комментарий к нему] ''(англ.)'' |
| * См. слова [[IF]] и [[THEN]], а также [[TRUE]] и [[FALSE]]
| | * [http://www.forth200x.org/documents/html/core.html#core:ELSE Слово ELSE в черновике Forth 200x] ''(англ.)'' и [http://www.forth200x.org/documents/html/rationale.html#rat:core:ELSE комментарий к нему] ''(англ.)'' |
| * Слово [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.1310 ELSE] и [http://forth.sourceforge.net/standard/dpans/dpansa6.htm#A.6.1.1310 комментарий к нему] в стандарте ANS Forth ''(англ.)''
| |
| * Слово [http://forth-standard.org/standard/core/ELSE ELSE] и [http://forth-standard.org/standard/rationale#rat:core:ELSE комментарий к нему] в черновике 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] ''(англ.)''
| |
|
| |
|
|
| |
|
Строка 149: |
Строка 74: |
| {{заготовка}} | | {{заготовка}} |
| [[Категория:Слова Каллисто]] | | [[Категория:Слова Каллисто]] |
| [[Категория:Слова высокого уровня]]
| |
| [[Категория:Слова с признаком IMMEDIATE]]
| |
| [[Категория:Структуры управления Каллисто]] | | [[Категория:Структуры управления Каллисто]] |
| [[Категория:Слова, способные вызывать авост приложения]]
| |
| [[Категория:Компилирующие слова]]
| |
| [[Категория:Стандартные слова]]
| |
| [[Категория:1994 CORE]]
| |
| [[Категория:2012 CORE]]
| |