IF

Материал из ПМК вики
Перейти к навигации Перейти к поиску

IF (если) — стандартное слово Каллисто. Условный оператор.

IF             ( ф −− )                             Если ф ложен (ф=0), перейти к парному THEN (или ELSE).
Пример работы слова IF

Ветвление "IF" выполняет действия только при выполнении определённого условия, но может включать в себя альтернативу:

  • IF xxx THEN — фраза xxx выполняется тогда и только тогда, когда ф истинно (отлично от нуля)
  • IF xxx ELSE yyy THEN — фраза xxx выполняется, когда ф истинно (отлично от нуля), а yyy тогда и только тогда, когда ф ложно (равно нулю)

Любой IF, независимо от наличия части ELSE, всегда должен завершаться словом THEN. Эти два каллистянских слова образуют операторные скобки IF-THEN.

Ввод слова IF[править]

В режиме ЛАТ последовательно нажмите две клавиши  7   П 

IF в стандарте ANS Forth[править]

 6.1.1700   IF                                                              CORE
        Интерпретация: Семантика интерпретации для этого слова не определена.

        Компиляция: ( C: -- orig )
            Помещает адрес ячейки новой неразрешенной ссылки вперед orig на 
            стек потока управления. Добавляет семантику времени-выполнения, 
            данную ниже к текущему определению. Семантика не завершена, пока 
            orig не разрешена, например THEN или ELSE.

        Время-выполнения: ( x -- )
            Если все биты x нулевые, продолжает выполнение с адреса ячейки 
            определенного ссылкой orig.

        См.: 3.2.3.2 Стек потока-управления, 6.1.1310 ELSE, 6.1.2270 THEN.

 A.6.1.1700   IF
 Типичное использование:
        : X ... test IF ... THEN ... ;
 или
        : X ... test IF ... ELSE ... THEN ... ;

История[править]

«Разрушающий» (снимающий со стека верхнее значение) IF пришёл в Каллисто из Форта.

Условный оператор был изобретён Джоном Маккарти для языка Лисп в 1957-58 годах (англ.) на основе условного перехода, существовавшего в то время в Фортране. Будучи в комитете по разработке Алгола, Маккарти также внёс условный оператор в Алгол, откуда он и вошёл в Форт и другие языки программирования.

В конце 1950-ых годов, когда Чак Мур программировал для САО отслеживание советских спутников, фортрановский оператор IF … ELSE IF позволял выбирать команды интерпретатора по первому символу. Использование такого интерпретатора позволяло вводить (посредством перфокарт) разные уравнения для нескольких спутников, без дорогостоящей компиляции основной программы.

Слово IF впервые появилось в программе CURVE, написанной Чак Муром на Алголе для Burroughs B5500 в 1964 году (Национальная ускорительная лаборатория SLAC, Стэнфордский университет). Необычный постфиксный условный оператор является модификацией условного оператора, взятого из Алгола:

 Алгол — IF выражение THEN истина ELSE ложь
 CURVE — стек IF истина ELSE ложь THEN

«Истина» интерпретировалась, если на стеке был не-нуль. THEN предлагал уникальное завершение, отсутствие которого в Алголе всегда вводило в замешательство Чака Мура. Подобные выражения интерпретировались: IF сканировал вперёд до ELSE или THEN.

В 1970 году неразрушающий условный оператор 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. Они получили элегантную реализацию с адресами на стеке данных во время компиляции.

В colorForth Чак Мур вернулся к «неразрушающему» IF. Мотивацией послужило то, что лучше явно писать IF DROP где это необходимо, а последовательности DUP IF или ?DUP IF расходуют машинное время впустую.

IF в предыдущем стандарте Forth-83 (англ.)[править]

     IF           flag --                       C,I,79
                  -- sys   (compiling)
          Used in the form:
                  flag IF ... ELSE ... THEN
          or
                  flag IF ... THEN
          If flag is true, the words following IF are executed and the
          words following ELSE until just after THEN are skipped.  The
          ELSE part is optional.
          If flag is false, the words from IF through ELSE , or from
          IF through THEN (when no ELSE is used), are skipped.  sys is
          balanced with its corresponding ELSE or THEN .  See:  "9.9
          Control Structures"

IF в стандарте Forth-79 (англ.)[править]

IF             flag --                       I,C,210
    Used in a colon-definition in the form:
         flag  IF ... ELSE ... THEN   or
         flag  IF ... THEN
    If  flag is true,  the words following IF are executed and the
    words following ELSE are skipped.   The ELSE part is optional.
    If flag is false, words between IF and ELSE, or between IF and
    THEN  (when  no  ELSE is  used),  are  skipped.   IF-ELSE-THEN
    conditionals may be nested.

IF в fig-FORTH Release 1 glossary, май 1979 (англ.)[править]

IF             f --- (run-time)          -- addr n  (compile) P,C2,L0
       Occurs is a colon-definition in form:
              IF (tp) ...  ENDIF      .
              IF (tp) ... ELSE (fp) ... ENDIF
       At run-time, IF selects execution based on a boolean flag. If f is
       true (non-zero), execution continues ahead thru the true part. If f
       is false (zero), execution skips till just after ELSE to execute
       the false part. After either part, execution resumes after ENDIF.
       ELSE and its false part are optional.; if missing, false execution
       skips to just after ENDIF..
       At compile-time IF compiles 0BRANCH and reserves space for an offset
       at addr. addr and n are used later for resolution of the offset and
       error testing.

Реализация[править]

В Каллисто, как и в Форте, реализован «разрушающий IF»: слово IF всегда снимает со стека значение, в зависимости от которого выполняется одна или другая последовательность слов. Если вам важно ещё раз проверить это значение, необходимость его сохранения возложена на разработчика — обычно для этого используются слова или ?DUP.

IF можно использовать только внутри определений через двоеточие. Слово IF проверяет состояние компиляции, и если обнаруживает состояние исполнения, вызывает авост с сообщением об ошибке № 17.

Слово IF компилирует в шитый код оператор условного перехода, который будет прилежно выполняться вне зависимости от STATE.

3699 ;#IF
3700 ; IF             I ( ф −− )                             Если ф ложен (ф=0), перейти к парному THEN (или ELSE).
3701 LIF:            .DB     82H
3702                 .TEXT   "IF"                    ; ( флаг −− )
3703                 .DW     LELSE
3704 SIF:            .DW CALL                        ; Начало ветвления "IF".
3705 RIF:            .DW QCOMP, COMP,ZBRAND, GMARK, TWO, EXIT

Пример реализации IF из предыдущего стандарта Forth-83:

 : IF     COMPILE ?BRANCH  >MARK  ; IMMEDIATE

Реализация IF в СП-Форте 3.07:

: IF ?COMP HERE ?BRANCH, >MARK 1 ; IMMEDIATE 

Реализации из SP-Forth 4.20:

: IF  \ 94
\ Интерпретация: семантика неопределена.
\ Компиляция: ( C: -- orig )
\ Положить на управляющий стек позицию новой неразрешенной ссылки вперед orig.
\ Добавить семантику времени выполнения, данную ниже, к текущему определению.
\ Семантика незавершена, пока orig не разрешится, например, по THEN или ELSE.
\ Время выполнения: ( x -- )
\ Если все биты x нулевые, продолжать выполнение с позиции, заданной 
\ разрешением orig.
  ?COMP 0 ?BRANCH, >MARK 1
; IMMEDIATE
: IF  \ 94
  ?COMP 0 TC-?BRANCH, >MARK 1
; IMMEDIATE

Советская реализация[править]

Юрий Семёнов приводит следующее описание слова IF (стр. 59):

 : IF   COMPILE ?BRANCH HERE 0 , 2 ; IMMEDIATE

У Баранова-Ноздрунова определение слова IF выглядит так (стр. 58):

: IF  ( ---> A,1 )   COMPILE  ?BRANCH  >MARK  1  ;
                                         IMMEDIATE

Описание слова IF и определение IF…ELSE…THEN в ядре ФОРТ-ЕС:

IF     HК->А,2 /КОМПИЛЯЦИЯ/ НАЧАЛО ВЕТВЛЕНИЯ "IF"               47
          F-> /ИСПОЛНЕНИЕ/

                      Экран номер 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

Определение слова IF в FORTH ИТЭФ:

             HEAD    302Q,'I',306Q,$IF,$COL               ; IF
             DW  COMP,ZBRAN,HERE,ZERO,COMMA,TWO,SEMI

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


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