UNTIL: различия между версиями

Материал из ПМК вики
Перейти к навигации Перейти к поиску
Нет описания правки
 
(не показано 30 промежуточных версий этого же участника)
Строка 1: Строка 1:
'''UNTIL''' (до, пока не) — стандартное слово [[Каллисто]]. Проверка постусловия цикла «до».
UNTIL          ( ф −− )                            Если ф ложен (ф=0), повторить цикл BEGIN UNTIL ещё раз.
[[Файл:indefinite.gif|thumb|right|491px|Цикл BEGIN xxx f UNTIL всегда выполняется хотя бы 1 раз.<br>Картинка из книги Лео Броди «Starting FORTH»]]
[[Файл:indefinite.gif|thumb|right|491px|Цикл BEGIN xxx f UNTIL всегда выполняется хотя бы 1 раз.<br>Картинка из книги Лео Броди «Starting FORTH»]]
'''UNTIL''' (до, пока не) — стандартное слово [[Каллисто]].
Конец описания [[Цикл BEGIN-UNTIL|цикла "BEGIN UNTIL"]]. Используется вместе со словом [[BEGIN]]:
 
BEGIN тело-цикла условие UNTIL
Конец описания [[Цикл BEGIN-UNTIL|цикла "BEGIN UNTIL"]].


== Ввод слова UNTIL ==
В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите белые клавиши [[Клавиша 3|{{Серая клавиша|3}}]] [[Клавиша 4|{{Серая клавиша|4}}]] [[Клавиша 2|{{Серая клавиша|2}}]] [[Клавиша 7|{{Серая клавиша|7}}]] [[Клавиша -|{{Серая клавиша|−}}]]


== UNTIL в стандарте ANS Forth ==
== UNTIL в стандарте ANS Forth ==
<pre>
  6.1.2390  UNTIL                                                          CORE
  6.1.2390  UNTIL                                                          CORE
         Интерпретация: Семантика интерпретации для этого слова не определена.
         Интерпретация: Семантика интерпретации для этого слова не определена.
Строка 22: Строка 26:
  Типичное использование:
  Типичное использование:
         : X ... BEGIN ... test UNTIL ... ;
         : X ... BEGIN ... test UNTIL ... ;
</pre>
== История ==
В 1968 году Чак Мур работал в Mohasco Industries, Inc ([https://en.wikipedia.org/wiki/Amsterdam_%28city%29,_New_York Amsterdam NY], ''англ.''). Первая версия интерпретатора, получившая название FORTH, заработала на миникомпьютере IBM 1130 с графическим дисплеем 2250 (16-битный процессор с ОЗУ 8К, дисководом, клавиатурой, принтером и ридером/панчером перфокарт). Первый FORTH знал слово UNTIL под именем END
Слово END, как синоним UNTIL, допускали Форт-83, Форт-79 и fig-Форт.


Создатель Форта Чак Мур признался, что заимствовал цикл BEGIN…UNTIL из языка Алгол.


== UNTIL в предыдущем стандарте Forth-83 (англ.) ==
=== UNTIL в предыдущем стандарте Forth-83 (англ.) ===
       UNTIL        flag --                      C,I,79
       UNTIL        flag --                      C,I,79
                   sys --  (compiling)
                   sys --  (compiling)
Строка 35: Строка 46:
           corresponding BEGIN .  See:  BEGIN
           corresponding BEGIN .  See:  BEGIN


 
=== UNTIL в стандарте Forth-79 (англ.) ===
== UNTIL в стандарте Forth-79 (англ.) ==
  UNTIL          flag --                      I,C,,237
  UNTIL          flag --                      I,C,,237
     Within a colon-definition, mark the end of a BEGIN-UNTIL loop,
     Within a colon-definition, mark the end of a BEGIN-UNTIL loop,
Строка 43: Строка 53:
     first word after BEGIN.  BEGIN-UNTIL structures may be nested.
     first word after BEGIN.  BEGIN-UNTIL structures may be nested.


 
=== UNTIL в fig-FORTH Release 1 glossary, май 1979 (англ.) ===
== UNTIL в fig-FORTH Release 1 glossary, май 1979 (англ.) ==
  UNTIL          f --- (run-time)      addr n --- (compile) P,C2,L0
  UNTIL          f --- (run-time)      addr n --- (compile) P,C2,L0
         Occurs within a colon-definition in the form:
         Occurs within a colon-definition in the form:
Строка 56: Строка 65:
         addr. n is used for error tests.
         addr. n is used for error tests.


== Реализация ==
На этапе компиляции UNTIL может вызывать [[Авост приложения|авост]].
<pre>
3659 RLRESOLVE:      .DW LITP
3660                .DB 39,17                      ; 10001
3661                .DW SUB, BRAN,RCOMMA
3662
3663 ;#UNTIL
3664 ; UNTIL          I ( ф −− )                            Если ф ложен (ф=0), повторить цикл BEGIN UNTIL ещё раз.
3665 LUNTIL:        .DB    85H
3666                .TEXT  "UNTIL"                ; ( флаг −− )
3667                .DW    LLRESOLVE              ; Конец цикла "BEGIN UNTIL".
3668 UNTIL:          .DW CALL, ONE,QPAIR, COMP,ZBRAND, BRAN,RLRESOLVE
</pre>
Реализации из SP-Forth 4.20:
<pre>
: UNTIL \ 94
\ Интерпретация: семантика неопределена.
\ Компиляция: ( C: dest -- )
\ Добавить семантику времени выполнения, данную ниже, к текущему определению.
\ Разрешить ссылку назад dest.
\ Время выполнения: ( x -- )
\ Если все биты x нулевые, продолжать выполнение с позиции, заданной dest.
  ?COMP 3 <> IF -2004 THROW THEN \ ABORT" UNTIL без BEGIN !"
  ?BRANCH,
  0xFFFFFF80  DP @ 4 - @  U<
  IF  DP @ 5 - W@ 0x3F0 + DP @ 6 - W!  -4 ALLOT
  THEN  DP @ TO :-SET
; IMMEDIATE
</pre>
<pre>
: UNTIL \ 94
  ?COMP 3 <> IF -2004 THROW THEN \ ABORT" UNTIL без BEGIN !"
  TC-?BRANCH,
  0xFFFFFF80  DP @ 4 - @  U<
  IF  DP @ 5 - W@ 0x3F0 + DP @ 6 - W!  -4 ALLOT
  THEN DP @ TO :-SET
; IMMEDIATE
</pre>


 
=== Советская реализация ===
== Реализация UNTIL ==
Юрий Семёнов приводит следующее описание слова UNTIL (стр. 65):
Юрий Семёнов приводит следующее описание слова UNTIL (стр. 65):
   : UNTIL  1 ?PAIR COMPILE ?BRANCH <RESOLVE ; IMMEDIATE
   : UNTIL  1 ?PAIR COMPILE ?BRANCH <RESOLVE ; IMMEDIATE
Строка 66: Строка 113:
       COMPILE  ?BRANCH  <RESOLVE  ;  IMMEDIATE
       COMPILE  ?BRANCH  <RESOLVE  ;  IMMEDIATE


== История ==
Описание слова UNTIL и определение [[Цикл BEGIN-UNTIL|цикла BEGIN…UNTIL]] в ядре ФОРТ-ЕС:
Форт-83, Форт-79 и fig-Форт допускали слово END, как синоним UNTIL.
<pre>
UNTIL    HK  A,1-> /КОМПИЛЯЦИЯ/ КОНЕЦ ЦИКЛА "BEGIN UNTIL"      47
            F-> /ИСПОЛНЕНИЕ/


                      Экран номер 47
( 31.03.86  СТАНДАРТНЫЕ СТРУКТУРЫ УПРАВЛЕНИЯ )
: BEGIN  ?COMP <MARK 1 ; IMMEDIATE
: UNTIL  1 ?PAIRS COMPILE ?BRANCH <RESOLVE ; IMMEDIATE
</pre>
Определение слова UNTIL в FORTH ИТЭФ:
<PRE>
            HEAD    305Q,'UNTI',314Q,UNTIL,$COL          ; UNTIL
            DW  ONE,QPAIR,COMP,ZBRAN,BACK,SEMI
</PRE>


== Ссылка ==
== Ссылка ==
* [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.2390 Слово UNTIL в стандарте ANS Forth] ''(англ.)'' и [http://forth.sourceforge.net/standard/dpans/dpansa6.htm#A.6.1.2390 комментарий к нему] ''(англ.)''
* {{Исходник|UNTIL|UNTIL}}
* [http://www.forth200x.org/documents/html/core.html#core:UNTIL Слово UNTIL в черновике Forth 200x] ''(англ.)'' и [http://www.forth200x.org/documents/html/rationale.html#rat:core:UNTIL комментарий к нему] ''(англ.)''
* См. слово [[BEGIN]]
* См. также слова [[WHILE]] и [[REPEAT]]
* Слово [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.2390 UNTIL] и [http://forth.sourceforge.net/standard/dpans/dpansa6.htm#A.6.1.2390 комментарий к нему] в стандарте ANS Forth ''(англ.)''
* Слово [http://forth-standard.org/standard/core/UNTIL UNTIL] и [http://forth-standard.org/standard/rationale#rat:core:UNTIL комментарий к нему] в черновике 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 Л.Броуди «Начальный курс программирования на языке Форт»]
* [https://en.wikipedia.org/wiki/Do_while_loop Do while loop в английской Википедии] ''(англ.)''
* [https://en.wikipedia.org/wiki/Do_while_loop Do while loop в английской Википедии] ''(англ.)''
* [http://www.forth.com/starting-forth/sf6/sf6.html Throw It For a Loop] в книге [http://www.forth.com/starting-forth/ Leo Brodie Starting Forth] ''(англ.)''




{{нет иллюстраций}}
{{заготовка}}
{{заготовка}}
[[Категория:Слова Каллисто]]
[[Категория:Слова Каллисто]]
[[Категория:Слова высокого уровня]]
[[Категория:Слова с признаком IMMEDIATE]]
[[Категория:Структуры управления Каллисто]]
[[Категория:Структуры управления Каллисто]]
[[Категория:Слова, способные вызывать авост приложения]]
[[Категория:Компилирующие слова]]
[[Категория:Стандартные слова]]
[[Категория:1994 CORE]]
[[Категория:2012 CORE]]

Текущая версия от 19:17, 13 ноября 2017

UNTIL (до, пока не) — стандартное слово Каллисто. Проверка постусловия цикла «до».

UNTIL          ( ф −− )                             Если ф ложен (ф=0), повторить цикл BEGIN UNTIL ещё раз.
Цикл BEGIN xxx f UNTIL всегда выполняется хотя бы 1 раз.
Картинка из книги Лео Броди «Starting FORTH»

Конец описания цикла "BEGIN UNTIL". Используется вместе со словом BEGIN:

BEGIN тело-цикла условие UNTIL

Ввод слова UNTIL[править]

В режиме ЛАТ последовательно нажмите белые клавиши  3   4   2   7    

UNTIL в стандарте ANS Forth[править]

 6.1.2390   UNTIL                                                           CORE
        Интерпретация: Семантика интерпретации для этого слова не определена.

        Компиляция: ( C: dest -- )
            Добавляет семантику времени-выполнения, данную ниже к текущему 
            определению, разрешая ссылку назад dest.

        Время-выполнения: ( x -- )
            Если все биты x нулевые, продолжает выполнение с адреса ячейки 
            определенного dest.

        См.: 6.1.0760 BEGIN.

 A.6.1.2390   UNTIL
 Типичное использование:
        : X ... BEGIN ... test UNTIL ... ;

История[править]

В 1968 году Чак Мур работал в Mohasco Industries, Inc (Amsterdam NY, англ.). Первая версия интерпретатора, получившая название FORTH, заработала на миникомпьютере IBM 1130 с графическим дисплеем 2250 (16-битный процессор с ОЗУ 8К, дисководом, клавиатурой, принтером и ридером/панчером перфокарт). Первый FORTH знал слово UNTIL под именем END

Слово END, как синоним UNTIL, допускали Форт-83, Форт-79 и fig-Форт.

Создатель Форта Чак Мур признался, что заимствовал цикл BEGIN…UNTIL из языка Алгол.

UNTIL в предыдущем стандарте Forth-83 (англ.)[править]

     UNTIL        flag --                       C,I,79
                  sys --   (compiling)
          Used in the form:
                  BEGIN ... flag UNTIL
          Marks the end of a BEGIN-UNTIL loop which will terminate
          based on flag.  If flag is true, the loop is terminated.  If
          flag is false, execution continues to just after the
          corresponding BEGIN .  sys is balanced with its
          corresponding BEGIN .  See:  BEGIN

UNTIL в стандарте Forth-79 (англ.)[править]

UNTIL          flag --                       I,C,,237
    Within a colon-definition, mark the end of a BEGIN-UNTIL loop,
    which will terminate based on flag.  If flag is true, the loop
    is  terminated.   If flag is false,  execution returns to  the
    first word after BEGIN.  BEGIN-UNTIL structures may be nested.

UNTIL в fig-FORTH Release 1 glossary, май 1979 (англ.)[править]

UNTIL          f --- (run-time)       addr n --- (compile) P,C2,L0
       Occurs within a colon-definition in the form:
                       BEGIN ... UNTIL
       At run-time, UNTIL controls the conditional branch back to the
       corresponding BEGIN. If f is false, execution returns to just after.
       BEGIN;
       if true, execution continues ahead.
       At compile-time, UNTIL compiles (0BRANCH) and an offset from HERE to
       addr. n is used for error tests.

Реализация[править]

На этапе компиляции UNTIL может вызывать авост.

3659 RLRESOLVE:      .DW LITP
3660                 .DB 39,17                       ; 10001
3661                 .DW SUB, BRAN,RCOMMA
3662 
3663 ;#UNTIL
3664 ; UNTIL          I ( ф −− )                             Если ф ложен (ф=0), повторить цикл BEGIN UNTIL ещё раз.
3665 LUNTIL:         .DB     85H
3666                 .TEXT   "UNTIL"                 ; ( флаг −− )
3667                 .DW     LLRESOLVE               ; Конец цикла "BEGIN UNTIL".
3668 UNTIL:          .DW CALL, ONE,QPAIR, COMP,ZBRAND, BRAN,RLRESOLVE

Реализации из SP-Forth 4.20:

: UNTIL \ 94
\ Интерпретация: семантика неопределена.
\ Компиляция: ( C: dest -- )
\ Добавить семантику времени выполнения, данную ниже, к текущему определению.
\ Разрешить ссылку назад dest.
\ Время выполнения: ( x -- )
\ Если все биты x нулевые, продолжать выполнение с позиции, заданной dest.
  ?COMP 3 <> IF -2004 THROW THEN \ ABORT" UNTIL без BEGIN !"
  ?BRANCH,
  0xFFFFFF80  DP @ 4 - @  U<
  IF  DP @ 5 - W@ 0x3F0 + DP @ 6 - W!   -4 ALLOT
  THEN  DP @ TO :-SET
; IMMEDIATE
: UNTIL \ 94
  ?COMP 3 <> IF -2004 THROW THEN \ ABORT" UNTIL без BEGIN !"
  TC-?BRANCH,
  0xFFFFFF80  DP @ 4 - @  U<
  IF  DP @ 5 - W@ 0x3F0 + DP @ 6 - W!   -4 ALLOT
  THEN DP @ TO :-SET
; IMMEDIATE

Советская реализация[править]

Юрий Семёнов приводит следующее описание слова UNTIL (стр. 65):

 : UNTIL   1 ?PAIR COMPILE ?BRANCH <RESOLVE ; IMMEDIATE

У Баранова-Ноздрунова определение слова UNTIL выглядит так (стр. 58):

: UNTIL  ( A1,2 ---> )   2 ?PAIRS
      COMPILE  ?BRANCH  <RESOLVE  ;  IMMEDIATE

Описание слова UNTIL и определение цикла BEGIN…UNTIL в ядре ФОРТ-ЕС:

UNTIL    HK  A,1-> /КОМПИЛЯЦИЯ/ КОНЕЦ ЦИКЛА "BEGIN UNTIL"      47
             F-> /ИСПОЛНЕНИЕ/

                      Экран номер 47
 ( 31.03.86   СТАНДАРТНЫЕ СТРУКТУРЫ УПРАВЛЕНИЯ )
 : BEGIN   ?COMP <MARK 1 ; IMMEDIATE
 : UNTIL   1 ?PAIRS COMPILE ?BRANCH <RESOLVE ; IMMEDIATE

Определение слова UNTIL в FORTH ИТЭФ:

             HEAD    305Q,'UNTI',314Q,UNTIL,$COL          ; UNTIL
             DW  ONE,QPAIR,COMP,ZBRAN,BACK,SEMI

Ссылка[править]


  Это заготовка статьи. Вы можете помочь проекту, дополнив её.