BEGIN

Материал из ПМК вики
Перейти к навигации Перейти к поиску

BEGIN (начать, начало) — стандартное слово Каллисто. Начать цикл.

BEGIN          ( −− )                               Отметить начало циклов BEGIN.

Два цикла с условием — BEGIN…WHILE…REPEAT и BEGIN…UNTIL — а также «бесконечный» цикл BEGIN…AGAIN начинаются со слова BEGIN:

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

Слово BEGIN отмечает начало цикла. При компиляции его главное назначение — запись в стек текущего значения указателя HERE, которое используют слова UNTIL, REPEAT или AGAIN, чтобы сформировать правильный адрес ветвления на начало цикла.

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

В режиме ЛАТ последовательно нажмите клавиши  В/О   ИП   БП   7   4 

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

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

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

        Время-выполнения: ( -- )
            Продолжает выполнение.

        См.: 3.2.3.2 Стек потока-управления, 6.1.2140 REPEAT, 6.1.2390 UNTIL, 
            6.1.2430 WHILE.

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

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

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

     BEGIN        --                            C,I,79
                  -- sys   (compiling)
          Used in the form:
                  BEGIN ... flag UNTIL
          or
                  BEGIN ... flag WHILE ... REPEAT
          BEGIN marks the start of a word sequence for repetitive
          execution.  A BEGIN-UNTIL loop will be repeated until flag
          is true.  A BEGIN-WHILE-REPEAT will be repeated until flag
          is false.  The words after UNTIL or REPEAT will be executed
          when either loop is finished.  sys is balanced with its
          corresponding UNTIL or WHILE .  See:  "9.9 Control
          Structures"

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

BEGIN                                        I,C,147
    Used in a colon-definition in the form:
         BEGIN ... flag UNTIL   or
         BEGIN ... flag WHILE ... REPEAT
    BEGIN  marks  the  start of a  word  sequence  for  repetitive
    execution.   A BEGIN-UNTIL loop will be repeated until flag is
    true.   A  BEGIN-WHILE-REPEAT loop will be repeated until flag
    is  false.   The words after UNTIL or REPEAT will be  executed
    when  either loop is finished.   flag is always dropped  after
    being tested.

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

 BEGIN         ---  addr  n  (compiling)     P,L0
        Occurs in a colon-definition in form:
           BEGIN ... UNTIL
           BEGIN ... AGAIN
           BEGIN ... WHILE ... REPEAT
        At run-time, BEGIN marks the start of a sequence that may be
        repetitively executed. It serves as a return point from the
        corresponding UNTIL, AGAIN or REPEAT. When executing UNTIL, a return
        to BEGIN will occur if the top of the stack is false;
        for AGAIN and REPEAT a return to BEGIN always occurs.

        At compile time BEGIN leaves its return address and n for compiler
        error checking.

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

Слово BEGIN начинает свою работу с того, что с помощью ?COMP убеждается — текстовый интерпретатор находится в состоянии компиляции. Если нет, слово ?COMP вызывает авост с сообщением об ошибке №17.

Само слово BEGIN ничего не компилирует в шитый код. Оно лишь запоминает в стеке текущий адрес, чтобы в дальнейшем скомпилировать на него условный (цикл BEGIN…UNTIL) или безусловный (циклы BEGIN…AGAIN и BEGIN…WHILE…REPEAT) переход.

3677 ;#BEGIN
3678 ; BEGIN          I ( −− )                               Начало циклов "BEGIN".
3679 LBEGIN:         .DB     85H
3680                 .TEXT   "BEGIN"
3681                 .DW     LAGAIN
3682 BEGIN:          .DW CALL, QCOMP, LMARK, ONE, EXIT

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

: BEGIN \ 94
\ Интерпретация: семантика неопределена.
\ Компиляция: ( C: -- dest )
\ Положить следующую позицию передачи управления, dest, на управляющий стек.
\ Добавить семантику времени выполнения, данную ниже, к текущему определению.
\ Время выполнения: ( -- )
\ Продолжить выполнение.
  ?COMP
  ALIGN-BYTES @ ALIGN-NOP
\  HERE TO :-SET
  <MARK 3
; IMMEDIATE
: BEGIN  POSTPONE BEGIN  DP @ TO :-SET  ; IMMEDIATE

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

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

 : BEGIN   ?COMP HERE 1 ; IMMEDIATE

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

: BEGIN  ( ---> A,2 )   <MARK  2  ; IMMEDIATE

В 11-й главе Starting FORTH слово BEGIN определяется так:

  : BEGIN HERE ; IMMEDIATE

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

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

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

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

             HEAD    305Q,'BEGI',316Q,BEGIN,$COL          ; BEGIN
             DW  QCOMP,HERE,ONE,SEMI

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


  У этой статьи нет иллюстраций. Вы можете помочь проекту, добавив их.


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