ELSE: различия между версиями
AtH (обсуждение | вклад) Нет описания правки |
AtH (обсуждение | вклад) |
||
(не показаны 23 промежуточные версии этого же участника) | |||
Строка 1: | Строка 1: | ||
'''ELSE''' (иначе) — стандартное слово [[Каллисто]]. | |||
ELSE ( −− ) Начало второй ветви ветвления IF. | |||
[[Файл:CallistoIf.png|thumb|right|264px|Пример работы слова ELSE]] | [[Файл:CallistoIf.png|thumb|right|264px|Пример работы слова ELSE]] | ||
== Ввод слова ELSE == | == Ввод слова ELSE == | ||
Строка 8: | Строка 7: | ||
== ELSE в стандарте ANS Forth == | == ELSE в стандарте ANS Forth == | ||
<pre> | |||
6.1.1310 ELSE CORE | 6.1.1310 ELSE CORE | ||
Интерпретация: Семантика интерпретации для этого слова не определена. | Интерпретация: Семантика интерпретации для этого слова не определена. | ||
Строка 27: | Строка 27: | ||
Типичное использование: | Типичное использование: | ||
: 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 Стэнфордский университет]). | |||
Необычный постфиксный условный оператор восходит к 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 в предыдущем стандарте Forth-83 (англ.) === | ||
ELSE -- C,I,79 | ELSE -- C,I,79 | ||
sys1 -- sys2 (compiling) | sys1 -- sys2 (compiling) | ||
Строка 38: | Строка 55: | ||
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: | ||
Строка 46: | Строка 63: | ||
the stack. (see IF) | the stack. (see IF) | ||
== ELSE в fig-FORTH Release 1 glossary, май 1979 (англ.) == | === ELSE в fig-FORTH Release 1 glossary, май 1979 (англ.) === | ||
<pre> | |||
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: | ||
Строка 58: | Строка 76: | ||
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 выглядит так (стр. 58): | У Баранова-Ноздрунова определение слова ELSE выглядит так (стр. 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}} | |||
* См. слова [[IF]] и [[THEN]], а также [[TRUE]] и [[FALSE]] | |||
* Слово [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.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:// | * Слово [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] ''(англ.)'' | |||
Строка 75: | Строка 152: | ||
[[Категория:Слова с признаком IMMEDIATE]] | [[Категория:Слова с признаком IMMEDIATE]] | ||
[[Категория:Структуры управления Каллисто]] | [[Категория:Структуры управления Каллисто]] | ||
[[Категория:Слова | [[Категория:Слова, способные вызывать авост приложения]] | ||
[[Категория:Компилирующие слова]] | |||
[[Категория:Стандартные слова]] | |||
[[Категория:1994 CORE]] | |||
[[Категория:2012 CORE]] |
Текущая версия от 19:21, 13 ноября 2017
ELSE (иначе) — стандартное слово Каллисто.
ELSE ( −− ) Начало второй ветви ветвления IF.
Ввод слова ELSE[править]
В режиме ЛАТ последовательно нажмите четыре клавиши ИП − 1 ИП
ELSE в стандарте ANS Forth[править]
6.1.1310 ELSE CORE Интерпретация: Семантика интерпретации для этого слова не определена. Компиляция: ( C: orig1 -- orig2 ) Помещает адрес ячейки новой неразрешенной ссылки вперед orig2 на стек потока управления. Добавляет семантику времени-выполнения данную ниже к текущему определению. Семантика будет не завершена, пока orig2 не разрешена (например, THEN). Разрешает ссылку вперед orig1 использованием адреса ячейки после добавленной семантики времени-выполнения. Время-выполнения: ( -- ) Продолжает выполнение с адреса ячейки данного ссылкой orig2. См.: 6.1.1700 IF, 6.1.2270 THEN. A.6.1.1310 ELSE Типичное использование: : X ... test IF ... ELSE ... THEN ;
История[править]
Слово ELSE является одним из самых древних слов Форта.
Впервые слово ELSE появилось в программе CURVE, написанной Чак Муром на Алголе для Burroughs B5500 в 1964 году (Национальная ускорительная лаборатория SLAC, Стэнфордский университет).
Необычный постфиксный условный оператор восходит к 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 sys1 -- sys2 (compiling) Used in the form: flag IF ... ELSE ... THEN ELSE executes after the true part following IF . ELSE forces execution to continue at just after THEN . sys1 is balanced with its corresponding IF . sys2 is balanced with its corresponding THEN . See: IF THEN
ELSE в стандарте Forth-79 (англ.)[править]
ELSE -- I,C,167 Used in a colon-definition in the form: IF ... ELSE ... THEN ELSE executes after the true part following IF. ELSE forces execution to skip till just after THEN. It has no effect on the stack. (see IF)
ELSE в fig-FORTH Release 1 glossary, май 1979 (англ.)[править]
ELSE addr1 n1 --- addr2 n2 (compiling) P,C2,L0 Occurs within a colon-definition in the form: IF ... ELSE ... ENDIF At run-time, ELSE executes after the true part following IF. ELSE forces execution to skip over the following false part and resumes execution after the ENDIF. It has no stack effect. At compile-time ELSE emplaces BRANCH reserving a branch offset, leaves the address addr2 and n2 for error testing. ELSE also resolves the pending forward branch from IF by calculating the offset from addr1 to HERE and storing at addr1.
Реализация[править]
На этапе компиляции ELSE может вызывать авост.
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
Реализации из SP-Forth 4.20:
: ELSE \ 94 \ Интерпретация: семантика неопределена. \ Компиляция: ( C: orig1 -- orig2 ) \ Положить на управляющий стек позицию новой неразрешенной ссылки вперед orig2. \ Добавить семантику времени выполнения, данную ниже, к текущему определению. \ Семантика незавершена, пока orig2 не разрешится (например, по THEN). \ Разрешить ссылку вперед orig1, используя позицию следующей добавленной \ семантики выполнения. \ Время выполнения: ( -- ) \ Продолжить выполнение с позиции, заданной разрешением orig2. ?COMP 0 BRANCH, >ORESOLVE >MARK 2 ; IMMEDIATE
: ELSE ?COMP 0 TC-BRANCH, TC>RESOLVE >MARK 2 ; IMMEDIATE
Советская реализация[править]
У Баранова-Ноздрунова определение слова ELSE выглядит так (стр. 58):
: ELSE ( A1,1 ---> A2,1 ) 1 ?PAIRS COMPILE BRANCH >MARK ↔ >RESOLVE 1 ; IMMEDIATE
Описание ELSE и определение IF…ELSE…THEN в ядре ФОРТ-ЕС:
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
Определение слова ELSE в FORTH ИТЭФ:
HEAD 304Q,'ELS',305Q,$ELSE,$COL ; ELSE DW TWO,QPAIR,COMP,BRAN,HERE,ZERO,COMMA DW SWAP,TWO,THEM,TWO,SEMI
Ссылки[править]
- Исходный текст слова ELSE в Каллисто Классик 1.0
- См. слова IF и THEN, а также TRUE и FALSE
- Слово ELSE и комментарий к нему в стандарте ANS Forth (англ.)
- Слово ELSE и комментарий к нему в черновике Forth 200x (англ.)
- КОМПЬЮТЕР "ПРИНИМАЕТ РЕШЕНИЯ" в книге Л.Броуди «Начальный курс программирования на языке Форт»
- Decisions, Decisions… в книге Leo Brodie Starting Forth (англ.)
У этой статьи нет иллюстраций. Вы можете помочь проекту, добавив их. |
Это заготовка статьи. Вы можете помочь проекту, дополнив её. |