Слово I

Материал из ПМК вики
Версия от 21:43, 13 ноября 2017; AtH (обсуждение | вклад) (→‎Реализация)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигации Перейти к поиску

I (счётчик цикла, читается «ай») — стандартное слово Каллисто. Переменная цикла FOR.

I              ( −− U )                             Дать текущее значение счётчика цикла FOR.
Пример работы слова I

Копирует текущее значение счётчика цикла в стек данных. Предназначено для использования внутри цикла FORNEXT. Заметим, что переменная цикла ведёт обратный отсчёт от количества циклов до единицы и всегда положительна.

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

В режиме ЛАТ нажмите белую клавишу  7 

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

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

        Выполнение: ( -- n|u )  ( R:  loop-sys -- loop-sys )
            n|u - копия текущего (самого внутреннего) индекса цикла. 
            Неопределенная ситуация существует, если параметры управления 
            циклом недоступны.

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

Название связано с использованием внутри циклов FOR .. NEXT — в них I копирует в стек значение индекса цикла.

В большинстве Фортов слова I и R@ являются синонимами. В Каллисто это так, лишь пока вы оперируете целыми числами от 0 до 32767.

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

     I            -- w                          C,79
          w is a copy of the loop index.  May only be used in the
          form:
                  DO ... I ... LOOP
          or
                  DO ... I ... +LOOP

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

I              -- n                          C,136
    Copy the loop index onto the data stack.   May only be used in
    the form:
         DO ... I ... LOOP   or
         DO ... I ... +LOOP

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

I             ---  n                         C,L0
       Used within a DO-LOOP to copy the loop index to the stack. Other use
       is implementation dependent.
       See R.

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

В Каллисто 1.0 слово I похоже на слово R@, но достаёт с вершины стека возвратов беззнаковое целое и поэтому немного быстрее:

1828 ;#I
1829 ; I                ( −− U )                             Значение счётчика цикла FOR.
1830 LI:             .DB     1
1831                 .TEXT   "I"                     ; ( −− n )
1832                 .DW     LRAT
1833 I:              .DW     JI                      ; Скопировать верхнее 16−битное число из стека возвратов в стек данных.
1834 JI:             RM2
1835 I0:             MA M5
1836                 KRMA RME ∗ KRM5 + KM3  KGOTO9

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

CODE C-I
      LEA EBP, -4 [EBP]
      MOV [EBP], EAX
      MOV EAX, [ESP]
      SUB EAX, 4 [ESP]
      RET
END-CODE
…
: I   \ 94
\ Интерпретация: семантика неопределена.
\ Выполнение: ( -- n|u ) ( R: loop-sys -- loop-sys )
\ n|u - копия текущего (внутреннего) индекса цикла. Неопределенная ситуация 
\ возникает, если парметры цикла недоступны.
  ?COMP  ['] C-I  INLINE,
; IMMEDIATE
: I   \ 94
  ?COMP S" C-I" TC-FINDOUT INLINE,
; IMMEDIATE

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

Слово I в ФОРТ-ЕС и FORTH ИТЭФ было примитивом. Вот его описание и определение в ФОРТ-ЕС:

I       К ->W ТЕКУЩЕЕ ЗНАЧЕНИЕ W СЧЕТЧИКА ЦИКЛА "ПО"            24

                     Экран номер 24
( 09.09.86 ЦИКЛЫ СО СЧЕТЧИКОМ: (DO/ I I' J   LEAVE)

CODE I  ( ->U ТЕКУЩЕЕ 3HАЧЕHИE СЧЕТЧИКА ЦИКЛА)
      RW1 RPULL, PUSHRW1 B, END-CODE

Вот его определение в FORTH ИТЭФ:

            HEAD     201Q,,311Q,I                         ; I
  RR$:      PUSH [BP]
  Z$:       NEXT

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


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