UNLOOP: различия между версиями

Материал из ПМК вики
Перейти к навигации Перейти к поиску
Нет описания правки
 
(не показано 10 промежуточных версий этого же участника)
Строка 1: Строка 1:
'''UNLOOP''' (читается «анлуп») — стандартное слово [[Каллисто]].
'''UNLOOP''' (разциклить, читается «анлуп») — стандартное слово [[Каллисто]].
  UNLOOP        ( −− )                              Снять со стека возвратов параметры управления циклом FOR
  UNLOOP        ( −− )                              Снять со стека возвратов параметры управления циклом FOR
                                                     для текущего уровня вложенности.
                                                     для текущего уровня вложенности.
Строка 44: Строка 44:


UNLOOP может быть использован несколько раз, для выхода из вложенных циклов.
UNLOOP может быть использован несколько раз, для выхода из вложенных циклов.
== Реализация ==
<pre>
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 для выхода изнутри цикла со счётчиком.
</pre>
Реализации из SP-Forth 4.20:
<pre>
: UNLOOP  \ 94
\ Интерпретация: семантика неопределена.
\ Выполнение: ( -- ) ( R: loop-sys -- )
\ Убрать параметры цикла текущего уровня. UNLOOP требуется для каждого
\ уровня вложения циклов перед выходом из определения по EXIT.
\ Неоднозначная ситуация возникает, если параметры цикла недоступны.
  ?COMP
  SetOP  0C24648D , \ lea esp, 0c [esp]
; IMMEDIATE
</pre>
<pre>
: UNLOOP  \ 94
  ?COMP
  SetOP  0C24648D , \ lea esp, 0c [esp]
; IMMEDIATE
</pre>


== Ссылки ==
== Ссылки ==
* {{Исходник|UNLOOP|UNLOOP}}
* {{Исходник|UNLOOP|UNLOOP}}
* См. слова [[EXIT]], [[LEAVE]], [[RDROP]], [[FOR]], [[NEXT]], [[Слово I|I]], [[Слово J|J]] и [[Слово K|K]]
* Слово [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.2380 UNLOOP] и [http://forth.sourceforge.net/standard/dpans/dpansa6.htm#A.6.1.2380 комментарий к нему] в стандарте ANS Forth ''(англ.)''
* Слово [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.2380 UNLOOP] и [http://forth.sourceforge.net/standard/dpans/dpansa6.htm#A.6.1.2380 комментарий к нему] в стандарте ANS Forth ''(англ.)''
* Слово [http://forth-standard.org/standard/core/UNLOOP UNLOOP] и [http://forth-standard.org/standard/rationale#rat:core:UNLOOP комментарий к нему] в черновике Forth 200x ''(англ.)''
* Слово [http://forth-standard.org/standard/core/UNLOOP UNLOOP] и [http://forth-standard.org/standard/rationale#rat:core:UNLOOP комментарий к нему] в черновике Forth 200x ''(англ.)''
* См. также слово [[LEAVE]]




Строка 57: Строка 89:
[[Категория:Примитивы]]
[[Категория:Примитивы]]
[[Категория:Структуры управления Каллисто]]
[[Категория:Структуры управления Каллисто]]
[[Категория:Операции со стеком возвратов Каллисто]]
[[Категория:Стандартные слова]]
[[Категория:1994 CORE]]
[[Категория:2012 CORE]]

Текущая версия от 19:26, 13 ноября 2017

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

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


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


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