Редактирование: 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


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


== WHILE в стандарте ANS Forth ==
== WHILE в стандарте ANS Forth ==
<pre>
  6.1.2430  WHILE                                                          CORE
  6.1.2430  WHILE                                                          CORE
         Интерпретация: Семантика интерпретации для этого слова не определена.
         Интерпретация: Семантика интерпретации для этого слова не определена.
Строка 25: Строка 21:
  Типичное использование:
  Типичное использование:
         : 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: Строка 36:
           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 (англ.) ===
 
<pre>
== WHILE в fig-FORTH Release 1 glossary, май 1979 (англ.) ==
  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: Строка 59:
         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 ==
 
Юрий Семёнов приводит следующее описание слова WHILE (стр. 65):
На этапе компиляции 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 (стр. 65):
   : WHILE  [COMPILE] IF ; IMMEDIATE
   : WHILE  [COMPILE] IF ; IMMEDIATE


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


== Ссылка ==
== Ссылка ==
* {{Исходник|WHILE|WHILE}}
* [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.2430 Слово WHILE в стандарте ANS Forth] ''(англ.)'' и [http://forth.sourceforge.net/standard/dpans/dpansa6.htm#A.6.1.2430 комментарий к нему] ''(англ.)''
* См. слова [[BEGIN]] и [[REPEAT]]
* [http://www.forth200x.org/documents/html/core.html#core:WHILE Слово WHILE в черновике Forth 200x] ''(англ.)'' и [http://www.forth200x.org/documents/html/rationale.html#rat:core:WHILE комментарий к нему] ''(англ.)''
* См. также слова [[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-standard.org/standard/core/WHILE WHILE] и [http://forth-standard.org/standard/rationale#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://www.forth.com/starting-forth/sf6/sf6.html Throw It For a Loop] в книге [http://www.forth.com/starting-forth/ Leo Brodie Starting Forth] ''(англ.)''




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

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

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