UNLOOP: различия между версиями
AtH (обсуждение | вклад) Нет описания правки |
AtH (обсуждение | вклад) |
||
(не показаны 32 промежуточные версии этого же участника) | |||
Строка 1: | Строка 1: | ||
'''UNLOOP''' — стандартное слово [[Каллисто]]. | '''UNLOOP''' (разциклить, читается «анлуп») — стандартное слово [[Каллисто]]. | ||
UNLOOP ( −− ) Снять со стека возвратов параметры управления циклом FOR | |||
для текущего уровня вложенности. | |||
Слово UNLOOP снимает со [[Стек возвратов Каллисто|стека возвратов]] служебную информацию одного цикла [[FOR]] … [[NEXT]], что позволяет использовать слово [[EXIT]] для досрочного выхода из определения. Чтобы покинуть слово изнутри несколько вложенных циклов [[FOR]] … [[NEXT]], требуется предварительно выполнить слово UNLOOP нужное число раз. | |||
Также (это характерно для [[Каллисто]], но не работает в большинстве Фортов) слово UNLOOP можно использовать перед словом [[LEAVE]], чтобы выйти сразу из нескольких вложенных циклов [[FOR]]. | |||
Хотя само слово UNLOOP не влияет на [[Стек данных|стек]], надо учитывать, что слова после [[NEXT]] чаще всего ожидают некоторое определённое состояние [[Стек данных|стека]]. | |||
== Ввод слова UNLOOP == | |||
В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите белые клавиши [[Клавиша 3|{{Серая клавиша|3}}]] [[Клавиша 4|{{Серая клавиша|4}}]] [[Клавиша -|{{Серая клавиша|−}}]] [[Клавиша 5|{{Серая клавиша|5}}]] [[Клавиша 5|{{Серая клавиша|5}}]] [[Клавиша 6|{{Серая клавиша|6}}]] | |||
== UNLOOP в стандарте ANS Forth == | |||
<PRE> | |||
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 более | |||
выражает действие: ничто не отменяется - мы просто прекращаем делать это. | |||
</PRE> | |||
== Замечание == | |||
Хотя в стандарте 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> | |||
== Ссылки == | == Ссылки == | ||
* [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.2380 | * {{Исходник|UNLOOP|UNLOOP}} | ||
* [http:// | * См. слова [[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-standard.org/standard/core/UNLOOP UNLOOP] и [http://forth-standard.org/standard/rationale#rat:core:UNLOOP комментарий к нему] в черновике Forth 200x ''(англ.)'' | |||
Строка 9: | Строка 87: | ||
{{заготовка}} | {{заготовка}} | ||
[[Категория:Слова Каллисто]] | [[Категория:Слова Каллисто]] | ||
[[Категория:Примитивы]] | |||
[[Категория:Структуры управления Каллисто]] | [[Категория:Структуры управления Каллисто]] | ||
[[Категория:Операции со стеком возвратов Каллисто]] | |||
[[Категория:Стандартные слова]] | |||
[[Категория:1994 CORE]] | |||
[[Категория:2012 CORE]] |
Текущая версия от 19:26, 13 ноября 2017
UNLOOP (разциклить, читается «анлуп») — стандартное слово Каллисто.
UNLOOP ( −− ) Снять со стека возвратов параметры управления циклом FOR для текущего уровня вложенности.
Слово UNLOOP снимает со стека возвратов служебную информацию одного цикла FOR … NEXT, что позволяет использовать слово EXIT для досрочного выхода из определения. Чтобы покинуть слово изнутри несколько вложенных циклов FOR … NEXT, требуется предварительно выполнить слово 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
Ссылки[править]
- Исходный текст слова UNLOOP в Каллисто Классик 1.0
- См. слова EXIT, LEAVE, RDROP, FOR, NEXT, I, J и K
- Слово UNLOOP и комментарий к нему в стандарте ANS Forth (англ.)
- Слово UNLOOP и комментарий к нему в черновике Forth 200x (англ.)
У этой статьи нет иллюстраций. Вы можете помочь проекту, добавив их. |
Это заготовка статьи. Вы можете помочь проекту, дополнив её. |