Редактирование: UNLOOP

Перейти к навигации Перейти к поиску
Внимание: Вы не вошли в систему. Ваш IP-адрес будет общедоступен, если вы запишете какие-либо изменения. Если вы войдёте или создадите учётную запись, её имя будет использоваться вместо IP-адреса, наряду с другими преимуществами.

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

Текущая версия Ваш текст
Строка 1: Строка 1:
'''UNLOOP''' (разциклить, читается «анлуп») — стандартное слово [[Каллисто]].
'''UNLOOP''' (читается «анлуп») — стандартное слово [[Каллисто]].
UNLOOP        ( −− )                              Снять со стека возвратов параметры управления циклом FOR
                                                    для текущего уровня вложенности.
Слово UNLOOP снимает со [[Стек возвратов Каллисто|стека возвратов]] служебную информацию одного цикла [[FOR]] … [[NEXT]], что позволяет использовать слово [[EXIT]] для досрочного выхода из определения. Чтобы покинуть слово изнутри несколько вложенных циклов [[FOR]] … [[NEXT]], требуется предварительно выполнить слово UNLOOP нужное число раз.


Также (это характерно для [[Каллисто]], но не работает в большинстве Фортов) слово UNLOOP можно использовать перед словом [[LEAVE]], чтобы выйти сразу из нескольких вложенных циклов [[FOR]].
Снимает со [[Стек возвратов Каллисто|стека возвратов]] служебную информацию одного цикла [[FOR]] [[NEXT]], что позволяет использовать слово [[EXIT]] для досрочного выхода из определения. Чтобы покинуть слово изнутри несколько вложенных циклов [[FOR]] [[NEXT]], требуется предварительно выполнить слово UNLOOP нужное число раз.
 
Хотя само слово UNLOOP не влияет на [[Стек данных|стек]], надо учитывать, что слова после [[NEXT]] чаще всего ожидают некоторое определённое состояние [[Стек данных|стека]].


== Ввод слова UNLOOP ==
== Ввод слова UNLOOP ==
Строка 12: Строка 7:


== UNLOOP в стандарте ANS Forth ==
== UNLOOP в стандарте ANS Forth ==
<PRE>
  6.1.2380  UNLOOP                                                          CORE
  6.1.2380  UNLOOP                                                          CORE
         Интерпретация: Семантика интерпретации для этого слова не определена.
         Интерпретация: Семантика интерпретации для этого слова не определена.
Строка 36: Строка 30:
  связанной do-loop конструкции. UNLOOP как функция был назван UNDO. UNLOOP более  
  связанной do-loop конструкции. UNLOOP как функция был назван UNDO. UNLOOP более  
  выражает действие: ничто не отменяется - мы просто прекращаем делать это.
  выражает действие: ничто не отменяется - мы просто прекращаем делать это.
</PRE>


== Замечание ==
== Замечание ==
Хотя в стандарте ANS Forth это явно не указано, после слова UNLOOP должно быть исполнено слово [[EXIT]].  Конечно, между ними могут быть выполнены и другие действия. Но если [[EXIT]] не будет выполнен до конца цикла, ситуация станет неопределённой.
Хотя в стандарте ANS Forth это явно не указано, после слова UNLOOP должно быть исполнено слово [[EXIT]].  Конечно, между ними могут быть выполнены и другие действия. Но если [[EXIT]] не будет выполнен до конца цикла, ситуация станет неопределённой.
Также UNLOOP может быть использован перед словом [[LEAVE]], если требуется завершить внешний цикл.
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}}
* См. слова [[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://www.forth200x.org/documents/html3/core/UNLOOP.html UNLOOP] и [http://www.forth200x.org/documents/html3/rationale.html#rat:core:UNLOOP комментарий к нему] в черновике Forth 200x ''(англ.)''
* См. также слово [[LEAVE]]




Строка 89: Строка 45:
[[Категория:Примитивы]]
[[Категория:Примитивы]]
[[Категория:Структуры управления Каллисто]]
[[Категория:Структуры управления Каллисто]]
[[Категория:Операции со стеком возвратов Каллисто]]
[[Категория:Слова Каллисто без стековых диаграмм]]
[[Категория:Стандартные слова]]
[[Категория:1994 CORE]]
[[Категория:2012 CORE]]
Пожалуйста, учтите, что любой ваш вклад в проект «ПМК вики» может быть отредактирован или удалён другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. Pmkwiki:Авторские права). НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!

В целях защиты вики от автоматического спама в правках просим вас решить следующую каптчу:

Отменить Справка по редактированию (в новом окне)