WHILE

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

WHILE (пока) — стандартное слово Каллисто. Проверка предусловия в цикле «пока».

WHILE          ( ф −− )                             Если ф ложен (ф=0), выйти из цикла BEGIN WHILE REPEAT.

Ветвление "WHILE" в цикле "BEGIN WHILE REPEAT" используется вместе со словами BEGIN и REPEAT:

BEGIN условие WHILE тело-цикла REPEAT

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

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

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

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

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

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

 A.6.1.2430   WHILE
 Типичное использование:
        : X ... BEGIN ... test WHILE ... REPEAT ... ;

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

В некоторых сверхкомпактных Фортах вместо слова WHILE используется слово IF, т.к. их реализации похожи.

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

     WHILE        flag --                       C,I,79
                  sys1 -- sys2   (compiling)
          Used in the form:
                  BEGIN ... flag WHILE ... REPEAT
          Selects conditional execution based on flag.  When flag is
          true, execution continues to just after the WHILE through to
          the REPEAT which then continues execution back to just after
          the BEGIN .  When flag is false, execution continues to just
          after the REPEAT , exiting the control structure.  sys1 is
          balanced with its corresponding BEGIN .  sys2 is balanced
          with its corresponding REPEAT .  See:  BEGIN

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

WHILE          flag --                       I,C,149
    Used in the form:
         BEGIN ... flag WHILE ... REPEAT
    Select conditional execution based on flag.   On a true  flag,
    continue execution through to REPEAT,  which then returns back
    to just after BEGIN.   On a false flag, skip execution to just
    after REPEAT, exiting the structure.

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

 WHILE   f --- (run-time)     ad1 nl --- ad1 n1 ad2 n2 p,C2
        Occurs in a colon-definition in the form:
                  BEGIN ... WHILE (tp) ... REPEAT
        At run-time, WHILE selects conditional execution based on boolean
        flag f. If f is true (non-zero), WHILE continues execution of the
        true part thru to REPEAT, which then branches back to BEGIN. If f is
        false (zero), execution skips to just after REPEAT, exiting the
        structure.

        At compile time, WHILE emplaces (0BRANCH) and leaves ad2 of the
        reserved offset. The stack values will be resolved by REPEAT.

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

По количеству ключевых слов цикл с предусловием while() в языке Си кажется «самым простым», а в Каллисто тот же цикл WHILE — «самый громоздкий». Целых три ключевых слова: BEGIN WHILE REPEAT.

На самом деле число ключевых слов в Каллисто меньше, т.к. в Си этот цикл чаще всего использует операторные скобки { }. И это если не считать обязательных (), в которых заключена проверка условия цикла.

На этапе компиляции WHILE может вызывать авост, сгенерировав ошибку времени компиляции.

3705 RIF:            .DW QCOMP, COMP,ZBRAND, GMARK, TWO, EXIT
3706 
3707 ;#WHILE
3708 ; WHILE          I ( ф −− )                             Если ф ложен (ф=0), выйти из цикла BEGIN WHILE REPEAT.
3709 LWHILE:         .DB     85H
3710                 .TEXT   "WHILE"                 ; ( флаг −− )
3711                 .DW     LIF                     ; Ветвление "WHILE" в цикле "BEGIN WHILE REPEAT".
3712 WHILE:          .DW CALL, ONE,QPAIR, ONE, BRAN,RIF

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

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

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

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

 : WHILE   [COMPILE] IF ; IMMEDIATE

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

: WHILE ( A1,2 ---> A1,A2,3 ) 2  ?PAIRS
      COMPILE  ?BRANCH  >MARK  3  ;  IMMEDIATE

Описание слово WHILE и определение цикла BEGIN…WHILE…REPEAT в ядре ФОРТ-ЕС:

                     Экран номер 47
WHILE   HK 1->А,2 /КОМПИЛЯЦИЯ/ ВЕТВЛЕНИЕ "WHILE" В             47
             F-> /ИСПОЛНЕНИЕ/ ЦИКЛЕ "BEGIN WHILE REPEAT"

( 31.03.86   СТАНДАРТНЫЕ СТРУКТУРЫ УПРАВЛЕНИЯ )
: BEGIN   ?COMP <MARK 1 ; IMMEDIATE
: WHILE   1 ?PAIRS 1 [COMPILE] IF ;           IMMEDIATE
: REPEAT  >R >R [COMPILE] AGAIN
          R> R> [COMPILE] THEN ;              IMMEDIATE

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

             HEAD    305Q,'WHIL',305Q,WHILE,$COL          ; WHILE
             DW  $IF,SEMI

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


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


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