ELSE

Материал из ПМК вики
Перейти к навигации Перейти к поиску
Версия для печати больше не поддерживается и может содержать ошибки обработки. Обновите закладки браузера и используйте вместо этого функцию печати браузера по умолчанию.

ELSE (иначе) — стандартное слово Каллисто.

ELSE           ( −− )                               Начало второй ветви ветвления IF.
Пример работы слова ELSE

Ввод слова 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

Ссылки


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


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