UNLOOP

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

UNLOOP (разциклить, читается «анлуп») — стандартное слово Каллисто.

UNLOOP         ( −− )                               Снять со стека возвратов параметры управления циклом FOR
                                                    для текущего уровня вложенности.

Слово UNLOOP снимает со стека возвратов служебную информацию одного цикла FORNEXT, что позволяет использовать слово EXIT для досрочного выхода из определения. Чтобы покинуть слово изнутри несколько вложенных циклов FORNEXT, требуется предварительно выполнить слово UNLOOP нужное число раз.

Также (это характерно для Каллисто, но не работает в большинстве Фортов) слово UNLOOP можно использовать перед словом LEAVE, чтобы выйти сразу из нескольких вложенных циклов FOR.

Хотя само слово UNLOOP не влияет на стек, надо учитывать, что слова после NEXT чаще всего ожидают некоторое определённое состояние стека.

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

В режиме ЛАТ последовательно нажмите белые клавиши  3   4      5   5   6 

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

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

        Выполнение: ( -- ) ( R: loop-sys -- )
            Снимает параметры управления циклом для текущего уровня 
            вложенности. UNLOOP требуется для каждого уровня вложенности 
            прежде, чем может быть выполнено EXIT определения. Неопределенная 
            ситуация существует если параметры управления циклом недоступны.

        См.: 3.2.3.3 Стек возвратов.

 A.6.1.2380   UNLOOP
 Типичное использование:
        : X  ...
         limit first
         DO
           ... test IF ... UNLOOP EXIT THEN ...
         LOOP ...
        ;

 UNLOOP позволяет использование EXIT в пределах контекста, DO ... LOOP и 
 связанной do-loop конструкции. UNLOOP как функция был назван UNDO. UNLOOP более 
 выражает действие: ничто не отменяется - мы просто прекращаем делать это.

Замечание[править]

Хотя в стандарте ANS Forth это явно не указано, после слова UNLOOP должно быть исполнено слово EXIT. Конечно, между ними могут быть выполнены и другие действия. Но если EXIT не будет выполнен до конца цикла, ситуация станет неопределённой.

Также UNLOOP может быть использован перед словом LEAVE, если требуется завершить внешний цикл.

UNLOOP может быть использован несколько раз, для выхода из вложенных циклов.

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

 719 JUNLOOP:        4                               ; Обработчик UNLOOP
 720 NLEV:           RM2 + M2                        ; Убрать из стека возвратов два слова, счётчик и адрес
 721                 KGOTO9
…
1787 ;#UNLOOP
1788 ; UNLOOP           ( −− )                               Снять со стека возвратов параметры управления циклом FOR для текущего уровня вложенности.
1789 LUNLOOP:        .DB     6
1790                 .TEXT   "UNLOOP"
1791                 .DW     LLEAVE
1792 UNLOOP:         .DW     JUNLOOP                 ; Обычно используется перед EXIT для выхода изнутри цикла со счётчиком.

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

: UNLOOP  \ 94
\ Интерпретация: семантика неопределена.
\ Выполнение: ( -- ) ( R: loop-sys -- )
\ Убрать параметры цикла текущего уровня. UNLOOP требуется для каждого
\ уровня вложения циклов перед выходом из определения по EXIT.
\ Неоднозначная ситуация возникает, если параметры цикла недоступны.
  ?COMP
  SetOP  0C24648D , \ lea esp, 0c [esp]
; IMMEDIATE
: UNLOOP  \ 94
  ?COMP
  SetOP  0C24648D , \ lea esp, 0c [esp]
; IMMEDIATE

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


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


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