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

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

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

Текущая версия Ваш текст
Строка 1: Строка 1:
'''LEAVE''' (выйти) — стандартное слово [[Каллисто]]. Аварийный выход из цикла [[FOR]].
'''LEAVE''' — стандартное слово [[Каллисто]].
LEAVE          ( −− )                              Закончить исполнение цикла FOR.
Досрочно и немедленно прерывает самый внутренний цикл [[FOR]] .. [[NEXT]]. Управление передаётся на слово, следующее после ближайшего [[NEXT]]. Обычно слово LEAVE используется изнутри [[IF|условного оператора]].


Чтобы покинуть сразу несколько вложенных циклов [[FOR]], используйте нужное число слов [[UNLOOP]] перед LEAVE.
Досрочно прерывает цикл [[FOR]] .. [[NEXT]] (только для области данных)


== Ввод слова LEAVE ==
В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите клавиши [[Клавиша -|{{Серая клавиша|−}}]] [[Клавиша ИП|{{Чёрная клавиша|ИП}}]] {{ШГ←}} [[Клавиша ↔|{{Серая клавиша|↔}}]] [[Клавиша ИП|{{Чёрная клавиша|ИП}}]]


== LEAVE в стандарте ANS Forth ==
== LEAVE в стандарте ANS Forth ==
<PRE>
  6.1.1760  LEAVE                                                          CORE
  6.1.1760  LEAVE                                                          CORE
         Интерпретация: Семантика интерпретации для этого слова не определена.
         Интерпретация: Семантика интерпретации для этого слова не определена.
Строка 26: Строка 21:
  Типичное использование:
  Типичное использование:
         : X ... DO ... IF ... LEAVE THEN ... LOOP ... ;
         : X ... DO ... IF ... LEAVE THEN ... LOOP ... ;
</PRE>


== История ==
В отличии от Форта, каллистянское слово LEAVE не обладает [[IMMEDIATE|признаком немедленного исполнения]] и не является компилирующим.


Реализация слова LEAVE в fig-Форте приравнивала счётчик цикла DO…LOOP к его границе, в результате чего последующее слово LOOP не выполняло переход на очередной цикл DO. 16-битный цикл DO…LOOP тех времён имел изъян. Он не позволял сделать просмотр адресов на границе 32Кб, например 32760 10 TYPE выдавало ошибку. Это вынудило провести реформу цикла DO…LOOP.
== LEAVE в предыдущем стандарте Forth-83 (англ.) ==
 
В круговом цикле на 64K (описанном у Баранова-Ноздрунова) старая реализация LEAVE перестала работать и стандарт Форта-83 утвердил новый вариант LEAVE (немедленно прерывающий цикл), как стандартный. Этот новый вариант и реализован в [[Каллисто]], где роль цикла DO выполняет более современный цикл [[FOR]] … [[NEXT]], взятый из {{colorForth}}.
 
=== LEAVE в предыдущем стандарте Forth-83 (англ.) ===
       LEAVE        --                            C,I,83
       LEAVE        --                            C,I,83
                   --  (compiling)
                   --  (compiling)
Строка 48: Строка 36:
           may appear within a do-loop.  See:  "9.3 Return Stack"
           may appear within a do-loop.  See:  "9.3 Return Stack"


=== LEAVE в стандарте Forth-79 (англ.) ===
 
== LEAVE в стандарте Forth-79 (англ.) ==
  LEAVE                                        C,213
  LEAVE                                        C,213
     Force  termination  of a DO-LOOP at the next LOOP or +LOOP  by
     Force  termination  of a DO-LOOP at the next LOOP or +LOOP  by
Строка 55: Строка 44:
     proceeds  normally  until  the  loop  terminating  word  is
     proceeds  normally  until  the  loop  terminating  word  is
     encountered.
     encountered.
=== LEAVE в fig-FORTH Release 1 glossary, май 1979 (англ.) ===
LEAVE                                        C,L0
        Force termination of a DO-LOOP at the next opportunity by setting
        the loop limit equal to the current value of the index. The index
        itself remains unchanged, and execution proceeds normally until LOOP
        or +LOOP is encountered.
== Реализация ==
<pre>
1775 ;#LEAVE
1776 ; LEAVE            ( −− )                              Выйти из цикла FOR досрочно.
1777 ; Досрочно прерывает цикл FOR .. NEXT (только для области данных)
1778 ; В стандарте Форт−83 это слово IMMEDIATE −− в данной реализации Каллисто обычное.
1779 LLEAVE:        .DB    5
1780                .TEXT  "LEAVE"
1781                .DW    LEXIT
1782 LEAVE:          .DW    JLEAVE
1783 JLEAVE:        RM2 1 + M5  3 + M2
1784                KRM5 RME ∗ KRM5 + M6
1785                KGOTO9
</pre>
Реализации из SP-Forth 4.20:
<pre>
: LEAVE    \ 94
\ Интерпретация: семантика неопределена.
\ Выполнение: ( -- ) ( R: loop-sys -- )
\ Убрать текущие параметры цикла. Неопределенная ситуация возникает, если
\ они недоступны. Продолжить выполнение сразу за самыми внутренними DO ... LOOP
\ или DO ... +LOOP.
  ?COMP
  SetOP 0824648D , \ lea esp, 08 [esp]
  SetOP C3 C,  \ ret
; IMMEDIATE
</pre>
<pre>
: LEAVE    \ 94
  ?COMP
  SetOP 0824648D , \ lea esp, 08 [esp]
  SetOP C3 C,  \ ret
; IMMEDIATE
</pre>
=== Советская реализация ===
Слово LEAVE в ФОРТ-ЕС было [[примитив]]ом. Вот его описание и определение:
<PRE>
LEAVE    К  -> ЗАКОНЧИТЬ ИСПОЛНЕНИЕ ЦИКЛА "DO"                24
                    Экран номер 24
( 09.09.86 ЦИКЛЫ СО СЧЕТЧИКОМ: (DO/ I I' J  LEAVE)
CODE LEAVE  ( -> ) RI RFIRST 4 +(, LH, RI RMASK NR,
    RRET 6 (, 0 RRET LA,  RNEXT BR,  END-CODE
</PRE>
В FORTH ИТЭФ слово LEAVE также было [[примитив]]ом, вот его определение:
<PRE>
  ;        ** Стек возвратов **
            HEAD    205Q 'LEAV',305Q,LEAVE                ; LEAVE
    MOV  AX, [BP]
            MOV  [BP]+2, AX
            NEXT
</PRE>


== Ссылки ==
== Ссылки ==
* {{Исходник|LEAVE|LEAVE}}
* [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.1760 Слово LEAVE в стандарте ANS Forth] ''(англ.)'' и [http://forth.sourceforge.net/standard/dpans/dpansa6.htm#A.6.1.1760 комментарий к нему] ''(англ.)''
* См. слова [[FOR]], [[NEXT]], [[UNLOOP]], [[Слово I|I]], [[Слово J|J]] и [[Слово K|K]]
* [http://www.forth200x.org/documents/html/core.html#core:LEAVE Слово LEAVE в черновике Forth 200x] ''(англ.)'' и [http://www.forth200x.org/documents/html/rationale.html#rat:core:LEAVE комментарий к нему] ''(англ.)''
* Слово [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.1760 LEAVE] и [http://forth.sourceforge.net/standard/dpans/dpansa6.htm#A.6.1.1760 комментарий к нему] в стандарте ANS Forth ''(англ.)''
* См. также слово [[UNLOOP]]
* Слово [http://forth-standard.org/standard/core/LEAVE LEAVE] и [http://forth-standard.org/standard/rationale#rat:core:LEAVE комментарий к нему] в черновике Forth 200x ''(англ.)''
* [http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20STARTING%20FORTH\06.ZIKLITESKIE%20STRUKTURY ЦИКЛИЧЕСКИЕ СТРУКТУРЫ] в книге [http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20STARTING%20FORTH Л.Броуди «Начальный курс программирования на языке Форт»]
* [http://www.forth.com/starting-forth/sf6/sf6.html Throw It For a Loop] в книге [http://www.forth.com/starting-forth/ Leo Brodie Starting Forth] ''(англ.)''




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

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

Отменить Справка по редактированию (в новом окне)
Источник — https://pmk.the-hacker.ru/LEAVE