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

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

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

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


Чтобы покинуть сразу несколько вложенных циклов [[FOR]], используйте нужное число слов [[UNLOOP]] перед LEAVE.
Досрочно и немедленно прерывает цикл [[FOR]] .. [[NEXT]]. Управление передаётся на слово, следующее после ближайшего [[NEXT]].


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


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


== История ==
== LEAVE в предыдущем стандарте Forth-83 (англ.) ==
В отличии от Форта, каллистянское слово LEAVE не обладает [[IMMEDIATE|признаком немедленного исполнения]] и не является компилирующим.
 
Реализация слова LEAVE в fig-Форте приравнивала счётчик цикла DO…LOOP к его границе, в результате чего последующее слово LOOP не выполняло переход на очередной цикл DO. 16-битный цикл DO…LOOP тех времён имел изъян. Он не позволял сделать просмотр адресов на границе 32Кб, например 32760 10 TYPE выдавало ошибку. Это вынудило провести реформу цикла DO…LOOP.
 
В круговом цикле на 64K (описанном у Баранова-Ноздрунова) старая реализация LEAVE перестала работать и стандарт Форта-83 утвердил новый вариант LEAVE (немедленно прерывающий цикл), как стандартный. Этот новый вариант и реализован в [[Каллисто]], где роль цикла DO выполняет более современный цикл [[FOR]] … [[NEXT]], взятый из {{colorForth}}.
 
=== LEAVE в предыдущем стандарте Forth-83 (англ.) ===
       LEAVE        --                            C,I,83
       LEAVE        --                            C,I,83
                   --  (compiling)
                   --  (compiling)
Строка 48: Строка 37:
           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
Строка 56: Строка 45:
     encountered.
     encountered.


=== LEAVE в fig-FORTH Release 1 glossary, май 1979 (англ.) ===
== LEAVE в fig-FORTH Release 1 glossary, май 1979 (англ.) ==
  LEAVE                                        C,L0
  LEAVE                                        C,L0
         Force termination of a DO-LOOP at the next opportunity by setting
         Force termination of a DO-LOOP at the next opportunity by setting
Строка 63: Строка 52:
         or +LOOP is encountered.
         or +LOOP is encountered.


== Реализация ==
== История ==
<pre>
Реализация слова LEAVE в fig-Форте приравнивала счётчик цикла DO…LOOP к его границе, в результате чего последующее слово LOOP не выполняло переход на очередной цикл DO. 16-битный цикл DO…LOOP тех времён имел изъян. Он не позволял сделать просмотр адресов на границе 32Кб, например 32760 10 TYPE выдавало ошибку. Это вынудило провести реформу цикла DO…LOOP.
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
В круговом цикле на 64K (описанном у Баранова-Ноздрунова) старая реализация LEAVE перестала работать и стандарт Форта-83 утвердил новый вариант LEAVE (немедленно прерывающий цикл), как стандартный. Этот новый вариант и реализован в [[Каллисто]], где роль цикла DO выполняет более современный цикл [[FOR]] … [[NEXT]], взятый из colorFORTH'а.
    MOV  AX, [BP]
            MOV  [BP]+2, AX
            NEXT
</PRE>


== Ссылки ==
== Ссылки ==
* {{Исходник|LEAVE|LEAVE}}
* См. слова [[FOR]], [[NEXT]], [[UNLOOP]], [[Слово I|I]], [[Слово J|J]] и [[Слово K|K]]
* Слово [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 ''(англ.)''
* Слово [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 ''(англ.)''
* Слово [http://forth-standard.org/standard/core/LEAVE LEAVE] и [http://forth-standard.org/standard/rationale#rat:core:LEAVE комментарий к нему] в черновике Forth 200x ''(англ.)''
* Слово [http://www.forth200x.org/documents/html3/core/LEAVE.html LEAVE] и [http://www.forth200x.org/documents/html3/rationale.html#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 Л.Броуди «Начальный курс программирования на языке Форт»]
* См. также слово [[UNLOOP]]
* [http://www.forth.com/starting-forth/sf6/sf6.html Throw It For a Loop] в книге [http://www.forth.com/starting-forth/ Leo Brodie Starting Forth] ''(англ.)''




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

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

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