REPEAT

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

REPEAT (повторить) — стандартное слово Каллисто. Конец цикла «пока» (англ. while) с предусловием.

REPEAT         ( −− )                               Вернуться к самому началу цикла BEGIN WHILE REPEAT.
Цикл BEGIN xxx f WHILE yyy REPEAT.
Картинка из книги Лео Броди «Starting FORTH»

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

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

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

В режиме ЛАТ последовательно нажмите клавиши  ×   ИП   6   ИП   ШГ←   2 

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

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

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

        Время-выполнения: ( -- )
            Продолжает выполнение с адреса ячейки, данного dest.

        См.: 6.1.0760 BEGIN, 6.1.2430 WHILE.

 A.6.1.2140   REPEAT
 Типичное использование:
        : FACTORIAL ( +n1 -- +n2)
           DUP 2 < IF  DROP 1 EXIT  THEN
           DUP
           BEGIN  DUP 2 > WHILE
             1-  SWAP OVER *  SWAP
           REPEAT  DROP
        ;

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

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

     REPEAT       --                            C,I,79
                  sys --   (compiling)
          Used in the form:
                  BEGIN ... flag WHILE ... REPEAT
          At execution time, REPEAT continues execution to just after
          the corresponding BEGIN .  sys is balanced with its
          corresponding WHILE .  See:  BEGIN

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

REPEAT         --                            I,C,120
    Used in a colon-definition in the form:
         BEGIN ... WHILE ... REPEAT
    At  run-time,  REPEAT returns to just after the  corresponding
    BEGIN.

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

 REPEAT         addr n --- (compiling)        P,C2
        Used within a colon-definition in the form:
                          BEGIN ... WHILE ... REPEAT
        At run-time, REPEAT forces an unconditional branch back to just
        after the corresponding BEGIN.

        At compile-time, REPEAT compiles BRANCH and the offset from HERE to
        addr. n is used for error testing.

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

На этапе компиляции REPEAT может вызывать авост:

3642 RGRESOLVE:      .DW HERE, LITP
3643                 .DB 39,17                       ; 10001
3644                 .DW SUB, SWAP, STORE, EXIT
…
3690 RTHEN:          .DW TWO,QPAIR, BRAN,RGRESOLVE
…
3714 ;#REPEAT
3715 ; REPEAT         I ( −− )                               Вернуться к самому началу цикла BEGIN WHILE REPEAT.
3716 LREPEAT:        .DB     86H
3717                 .TEXT   "REPEAT"
3718                 .DW     LWHILE                  ; Конец цикла "BEGIN WHILE REPEAT".
3719 REPEAT:         .DW CALL, TOR,TOR, AGAIN, FROMR,FROMR, BRAN,RTHEN

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

: REPEAT \ 94
\ Интерпретация: семантика неопределена.
\ Компиляция: ( C: orig dest -- )
\ Добавить семантику времени выполнения, данную ниже, к текущему определению,
\ разрешив ссылку назад dest. Разрешить ссылку вперед orig, используя 
\ позицию добавленной семантики выполнения.
\ Время выполнения: ( -- )
\ Продолжить выполнение с позиции, заданной dest.
  ?COMP
  3 <> IF -2005 THROW THEN \ ABORT" REPEAT без BEGIN !"
  DUP DP @ 2+ - DUP
  SHORT?
  IF SetJP 0xEB C, C, DROP
  ELSE DROP BRANCH, THEN
  >ORESOLVE
; IMMEDIATE
: REPEAT 
\ Продолжить выполнение с позиции, заданной dest.
  ?COMP
  3 <> IF -2005 THROW THEN \ ABORT" REPEAT без BEGIN !"
  DUP DP @ 2+ - DUP
  SHORT?
  IF SetJP 0xEB C, C, DROP
  ELSE DROP TC-BRANCH, THEN
  >RESOLVE
; IMMEDIATE

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

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

 : REPEAT   ROT 1 ?PAIRS ROT COMPILE BRANCH <RESOLVE
            [COMPILE] THEN ; IMMEDIATE

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

: REPEAT  ( A1,A2,3 ---> )   3 ?PAIRS COMPILE BRANCH
      ↔  <RESOLVE  >RESOLVE  ;  IMMEDIATE

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

REPEAT   HK  А1,1,А2,2-> /КОМПИЛЯЦИЯ/ КОНЕЦ ЦИКЛА               47
             -> /ИСПОЛНЕНИЕ/ "BEGIN WHILE REPEAT"

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

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

             HEAD    306Q,'REPEA',324Q,REPEAT,$COL        ; REPEAT
             DW  ROT,ONE,QPAIR,ROT,COMP,BRAN,BACK
             DW  THEN,SEMI

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


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