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

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

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

Текущая версия Ваш текст
Строка 1: Строка 1:
'''WHILE''' (пока) — стандартное слово [[Каллисто]]. Проверка предусловия в цикле «пока».
'''WHILE''' (пока) — стандартное слово [[Каллисто]].
WHILE          ( ф −− )                            Если ф ложен (ф=0), выйти из цикла BEGIN WHILE REPEAT.
 
Ветвление "[[WHILE]]" в [[Цикл BEGIN-WHILE-REPEAT|цикле "BEGIN WHILE REPEAT"]] используется вместе со словами [[BEGIN]] и [[REPEAT]]:
Ветвление "[[WHILE]]" в [[Цикл BEGIN-WHILE-REPEAT|цикле "BEGIN WHILE REPEAT"]].
BEGIN условие WHILE тело-цикла REPEAT


== Ввод слова WHILE ==
== Ввод слова WHILE ==
Строка 8: Строка 7:


== WHILE в стандарте ANS Forth ==
== WHILE в стандарте ANS Forth ==
<pre>
  6.1.2430  WHILE                                                          CORE
  6.1.2430  WHILE                                                          CORE
         Интерпретация: Семантика интерпретации для этого слова не определена.
         Интерпретация: Семантика интерпретации для этого слова не определена.
Строка 25: Строка 23:
  Типичное использование:
  Типичное использование:
         : X ... BEGIN ... test WHILE ... REPEAT ... ;
         : X ... BEGIN ... test WHILE ... REPEAT ... ;
</pre>
== История ==
В некоторых сверхкомпактных Фортах вместо слова WHILE используется слово [[IF]], т.к. их реализации похожи.


=== WHILE в предыдущем стандарте Forth-83 (англ.) ===
== WHILE в предыдущем стандарте Forth-83 (англ.) ==
       WHILE        flag --                      C,I,79
       WHILE        flag --                      C,I,79
                   sys1 -- sys2  (compiling)
                   sys1 -- sys2  (compiling)
Строка 43: Строка 37:
           with its corresponding REPEAT .  See:  BEGIN
           with its corresponding REPEAT .  See:  BEGIN


=== WHILE в стандарте Forth-79 (англ.) ===
== WHILE в стандарте Forth-79 (англ.) ==
  WHILE          flag --                      I,C,149
  WHILE          flag --                      I,C,149
     Used in the form:
     Used in the form:
Строка 52: Строка 46:
     after REPEAT, exiting the structure.
     after REPEAT, exiting the structure.


=== WHILE в fig-FORTH Release 1 glossary, май 1979 (англ.) ===
== WHILE в fig-FORTH Release 1 glossary, май 1979 (англ.) ==
<pre>
  WHILE  f --- (run-time)    ad1 nl --- ad1 n1 ad2 n2 p,C2
  WHILE  f --- (run-time)    ad1 nl --- ad1 n1 ad2 n2 p,C2
         Occurs in a colon-definition in the form:
         Occurs in a colon-definition in the form:
Строка 65: Строка 58:
         At compile time, WHILE emplaces (0BRANCH) and leaves ad2 of the
         At compile time, WHILE emplaces (0BRANCH) and leaves ad2 of the
         reserved offset. The stack values will be resolved by REPEAT.
         reserved offset. The stack values will be resolved by REPEAT.
</pre>
== Реализация ==
По количеству ключевых слов цикл с предусловием while() в языке Си кажется «самым простым», а в [[Каллисто]] тот же цикл WHILE — «самый громоздкий». Целых три ключевых слова: [[BEGIN]] WHILE [[REPEAT]].
На самом деле число ключевых слов в [[Каллисто]] меньше, т.к. в Си этот цикл чаще всего использует операторные скобки { }. И это если не считать обязательных (), в которых заключена проверка условия цикла.
На этапе компиляции WHILE может вызывать [[Авост приложения|авост]], сгенерировав ошибку времени компиляции.
<pre>
3705 RIF:            .DW QCOMP, COMP,ZBRAND, GMARK, TWO, EXIT
3706
3707 ;#WHILE
3708 ; WHILE          I ( ф −− )                            Если ф ложен (ф=0), выйти из цикла BEGIN WHILE REPEAT.
3709 LWHILE:        .DB    85H
3710                .TEXT  "WHILE"                ; ( флаг −− )
3711                .DW    LIF                    ; Ветвление "WHILE" в цикле "BEGIN WHILE REPEAT".
3712 WHILE:          .DW CALL, ONE,QPAIR, ONE, BRAN,RIF
</pre>
Реализации из SP-Forth 4.20:
<pre>
: WHILE \ 94
\ Интерпретация: семантика неопределена.
\ Компиляция: ( C: dest -- orig dest )
\ Положить позицию новой неразрешенной ссылки вперед orig на управляющий стек
\ под имеющимся dest. Добавить семантику времени выполнения, данную ниже, к
\ текущему определению. Семантика незавершена, пока orig и dest не разрешатся
\ (например, по REPEAT).
\ Время выполнения: ( x -- )
\ Если все биты x нулевые, продолжать выполнение с позиции, заданной
\ разрешением orig.
  ?COMP [COMPILE] IF
  2SWAP
; IMMEDIATE
</pre>
<pre>
: WHILE \ 94
  ?COMP 0 TC-?BRANCH, >MARK 1
  2SWAP
; IMMEDIATE
</pre>


=== Советская реализация ===
== Реализация WHILE ==
Юрий Семёнов приводит следующее определение слова WHILE (стр. 65):
Юрий Семёнов приводит следующее описание слова WHILE (стр. 65):
   : WHILE  [COMPILE] IF ; IMMEDIATE
   : WHILE  [COMPILE] IF ; IMMEDIATE


Строка 114: Строка 67:
       COMPILE  ?BRANCH  >MARK  3  ;  IMMEDIATE
       COMPILE  ?BRANCH  >MARK  3  ;  IMMEDIATE


Описание слово WHILE и определение [[Цикл BEGIN-WHILE-REPEAT|цикла BEGIN…WHILE…REPEAT]] в ядре ФОРТ-ЕС:
Определение цикла BEGIN…WHILE…REPEAT в ядре ФОРТ-ЕС:
<PRE>
<PRE>
                     Экран номер 47
                     Экран номер 47
WHILE  HK 1->А,2 /КОМПИЛЯЦИЯ/ ВЕТВЛЕНИЕ "WHILE" В            47
            F-> /ИСПОЛНЕНИЕ/ ЦИКЛЕ "BEGIN WHILE REPEAT"
( 31.03.86  СТАНДАРТНЫЕ СТРУКТУРЫ УПРАВЛЕНИЯ )
( 31.03.86  СТАНДАРТНЫЕ СТРУКТУРЫ УПРАВЛЕНИЯ )
: BEGIN  ?COMP <MARK 1 ; IMMEDIATE
: BEGIN  ?COMP <MARK 1 ; IMMEDIATE
Строка 125: Строка 75:
: REPEAT  >R >R [COMPILE] AGAIN
: REPEAT  >R >R [COMPILE] AGAIN
           R> R> [COMPILE] THEN ;              IMMEDIATE
           R> R> [COMPILE] THEN ;              IMMEDIATE
</PRE>
Определение слова WHILE в FORTH ИТЭФ:
<PRE>
            HEAD    305Q,'WHIL',305Q,WHILE,$COL          ; WHILE
            DW  $IF,SEMI
</PRE>
</PRE>


== Ссылка ==
== Ссылка ==
* {{Исходник|WHILE|WHILE}}
* См. слова [[BEGIN]] и [[REPEAT]]
* См. также слова [[UNTIL]] и [[AGAIN]]
* Слово [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.2430 WHILE] и [http://forth.sourceforge.net/standard/dpans/dpansa6.htm#A.6.1.2430 комментарий к нему] в стандарте ANS Forth ''(англ.)''
* Слово [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.2430 WHILE] и [http://forth.sourceforge.net/standard/dpans/dpansa6.htm#A.6.1.2430 комментарий к нему] в стандарте ANS Forth ''(англ.)''
* Слово [http://forth-standard.org/standard/core/WHILE WHILE] и [http://forth-standard.org/standard/rationale#rat:core:WHILE комментарий к нему] в черновике Forth 200x ''(англ.)''
* Слово [http://www.forth200x.org/documents/html3/core/WHILE.html WHILE] и [http://www.forth200x.org/documents/html3/rationale.html#rat:core:WHILE комментарий к нему] в черновике Forth 200x ''(англ.)''
* [https://en.wikipedia.org/wiki/While_loop While loop в английской Википедии] ''(англ.)''
* [https://en.wikipedia.org/wiki/While_loop While loop в английской Википедии] ''(англ.)''
* [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://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 Л.Броуди «Начальный курс программирования на языке Форт»]
Строка 149: Строка 91:
[[Категория:Слова с признаком IMMEDIATE]]
[[Категория:Слова с признаком IMMEDIATE]]
[[Категория:Структуры управления Каллисто]]
[[Категория:Структуры управления Каллисто]]
[[Категория:Слова, способные вызывать авост приложения]]
[[Категория:Слова Каллисто без стековых диаграмм]]
[[Категория:Компилирующие слова]]
[[Категория:Стандартные слова]]
[[Категория:1994 CORE]]
[[Категория:2012 CORE]]
Пожалуйста, учтите, что любой ваш вклад в проект «ПМК вики» может быть отредактирован или удалён другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. Pmkwiki:Авторские права). НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!

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

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