WORD

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

WORD (слово, читается «ворд») — стандартное слово Каллисто.

WORD           ( c −− a )                           Ввести слово до стоп−литеры c.
                                                    Дать его адрес, как строки со счётчиком.

Считывает одно слово из входного или экранного буфера и размещает его, начиная с адреса HERE

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

В режиме ЛАТ последовательно нажмите четыре клавиши  В↑   5   ×   K 

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

 6.1.2450   WORD                                                            CORE
            ( char "<chars>ccc<char>" -- c-addr )
            Пропускает ведущие разделители. Выделяет символы ccc ограниченные 
            char. Неопределенная ситуация существует, если длина выделенной 
            строки больше чем длина определенной реализацией строки со 
            счетчиком.

            c-addr - адрес временной области, содержащей выделенное слово как 
            строку со счетчиком. Если область анализа была пуста или не 
            содержала других символов кроме разделителей, результирующая строка 
            имеет нулевую длину. За строкой следует не включенный в длину 
            пробел. Программа может изменять символы в пределах строки.

        Примечание: Требование, о следовании пробела за строкой устаревшее и 
            включено как уступка существующим программам, которые используют 
            CONVERT. Программа не должна зависеть от существования пробела.

        См.: 3.3.3.6 Другие временные области, 3.4.1 Синтаксический анализ.

 A.6.1.2450   WORD
 Типичное использование:
        char WORD ccc<char>

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

Слово WORD появилось в 1958 году в самой первой версии интерпретатора Форта, написанного Чак Муром на Фортране для IBM EDPM 704 для САО. Тогда оно ещё не называлось WORD, так как в то время команды Форта кодировались числами.

Важно, что первый WORD считывал для INTERPRET слова, разделённые пробелами. Подобный ввод в свободном формате был необычен для того времени, но более эффективным (компактней и быстрее) и надёжным. Фортрановский ввод был отформатирован в конкретные колонки и ошибки набора приводили к многочисленным задержкам.

Чак Мур отказался от слова WORD в colorForth, где вводимые слова не буферизуются в редактируемой строке, а исполняются сразу по нажатию клавиши «Пробел».

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

      WORD         char -- addr                  M,83
           Generates a counted string by non-destructively accepting
           characters from the input stream until the delimiting
           character char is encountered or the input stream is
           exhausted.  Leading delimiters are ignored.  The entire
           character string is stored in memory beginning at addr as a
           sequence of bytes.  The string is followed by a blank which
           is not included in the count.  The first byte of the string
           is the number of characters {0..255}.  If the string is
           longer than 255 characters, the count is unspecified.  If
           the input stream is already exhausted as WORD is called,
           then a zero length character string will result.

           If the delimiter is not found the value of >IN is the size
           of the input stream.  If the delimiter is found >IN is
           adjusted to indicate the offset to the character following
           the delimiter.  #TIB is unmodified.

           The counted string returned by WORD may reside in the "free"
           dictionary area at HERE or above.  Note that the text
           interpreter may also use this area.  See:  "input stream"

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

WORD           char -- addr                  181
    Receive  characters  from the input stream until the  non-zero
    delimiting  character  is encountered or the input  stream  is
    exhausted,  ignoring leading delimiters.   The characters  are
    stored  as  a  packed string with the character count  in  the
    first  character position.   The actual delimiter  encountered
    (char  or  null)  is stored at the end of  the  text  but  not
    included  in the count.   If the input stream was exhausted as
    WORD is called,  then a zero length will result.   The address
    of the beginning of this packed string is left on the stack.

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

WORD          c  ---                            L0
       Read the next text characters from the input stream being
       interpreted, until a delimiter c is found, storing the packed
       character string beginning at the dictionary buffer HERE. WORD
       leaves the character count in the first byte, the characters, and
       ends with two or more blanks. Leading occurrences of c are ignored.
       If BLK is zero text is taken from the terminal input buffer,
       otherwise from the disc block stored in BLK.
       See BLK, IN.

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

Слово WORD кладёт адрес считанного слова в стек, как это требует Форт. Этот адрес a всегда равен HERE — как и в большинстве реализаций Форта. Первый байт по адресу a содержит число символов в считанном слове. Фактически это уже заготовка для поля имени новой словарной статьи, ждущая своего ALLOT.

Длина имени слова ограничивается 31 литерой.

3167 ;#WORD
3168 ; WORD             ( c −− a )                           Ввести слово до стоп−литеры c. Дать его адрес, как строки со счётчиком.
3169 ; Считать одно слово из входного или экранного буфера и разместить его, начиная с адреса HERE
3170 ; Первый байт содержит число литер в слове.
3171 ; Положить адрес считанного слова на стек, как это требует Форт−79.
3172 ; Этот адрес a всегда HERE −− как и в большинстве реализаций Форта.
3173 LWORD:          .DB     4
3174                 .TEXT   "WORD"                  ; ( c "<c>ccc<c>" −− HERE )
3175                 .DW     LPAD
3176 WORD:           .DW CALL, BLK,UAT, QDUP,ZBRAN,WD1, BLOCK, BRAN,WD2
3177 WD1:            .DW TIB
3178 WD2:            .DW IN,UAT, PLUS, SWAP, ENCL
3179                 .DW HERE, BL,BLANK              ; BL == 32  ( 31 имя и 1 байт длины)
3180                 .DW IN,PSTOR, DUP,TOR, HERE,CSTOR
3181                 .DW HERE,ONEP, FROMR, CMOVE, HERE, EXIT

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

: WORD ( char "<chars>ccc<char>" -- c-addr ) \ 94
\ Пропустить ведущие разделители. Выбрать символы, ограниченные
\ разделителем char.
\ Исключительная ситуация возникает, если длина извлеченной строки
\ больше максимальной длины строки со счетчиком.
\ c-addr - адрес переменной области, содержащей извлеченное слово
\ в виде строки со счетчиком.
\ Если разбираемая область пуста или содержит только разделители,
\ результирующая строка имеет нулевую длину.
\ В конец строки помещается пробел, не включаемый в длину строки.
\ Программа может изменять символы в строке.
  DUP SKIP PARSE 255 MIN
  DUP SYSTEM-PAD C! SYSTEM-PAD CHAR+ SWAP CMOVE
  0 SYSTEM-PAD COUNT CHARS + C!
  SYSTEM-PAD
;

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

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

WORD      С->Т  ВВЕСТИ СЛОВО ДО СТОП-ЛИТЕРЫ C;                 27
             ДАТЬ ЕГО АДРЕС КАК СТРОКИ СО СЧЕТЧИКОМ

                     Экран номер 27
( 31.03.66    ENCLOSE  WORD )

: WORD  ( C->T )   BLK @ IF BLK @ BLOCK ELSE TIB THEN
  >IN @ + SWAP ENCLOSE >IN +!
  HERE >R OVER - >R + ALIGNH HERE 1+ R@ CMOVE
  HERE R> 1+ ALLOT ALIGNH HERE OVER - 2- OVER C! R> DP! ;

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

             HEAD    204Q,'WOR',304Q,$WORD,$COL           ; WORD
             DW  BLK,AT,DDUP,ZBRAN,WD1-$,BLOCK,BRAN,WD2-$
   WD1:      DW  TIB,AT
   WD2:      DW  IN,AT,PLUS,SWAP,ENCL,HERE,BLAN,BLANK,IN
             DW  PSTOR,TOR,I,HERE,CSTOR
             DW  HERE,ONEP,FROMR,CMOVE,SEMI

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


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


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