REPEAT
REPEAT (повторить) — стандартное слово Каллисто. Конец цикла «пока» (англ. while) с предусловием.
REPEAT ( −− ) Вернуться к самому началу цикла BEGIN WHILE REPEAT.
Конец цикла "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
Ссылки[править]
- Исходный текст слова REPEAT в Каллисто Классик 1.0
- См. слова BEGIN и WHILE
- См. также слова UNTIL и AGAIN
- Слово REPEAT и комментарий к нему в стандарте ANS Forth (англ.)
- Слово REPEAT и комментарий к нему в черновике Forth 200x (англ.)
- ЦИКЛИЧЕСКИЕ СТРУКТУРЫ в книге Л.Броуди «Начальный курс программирования на языке Форт»
- Throw It For a Loop в книге Leo Brodie Starting Forth (англ.)
Это заготовка статьи. Вы можете помочь проекту, дополнив её. |