Текущая версия |
Ваш текст |
Строка 1: |
Строка 1: |
| '''WORD''' (слово, читается «ворд») — стандартное слово [[Каллисто]]. | | '''WORD''' — стандартное слово [[Каллисто]]. |
| WORD ( c −− a ) Ввести слово до стоп−литеры c.
| |
| Дать его адрес, как строки со счётчиком.
| |
| Считывает одно слово из [[Входной буфер терминала|входного]] или [[Буфер|экранного]] буфера и размещает его, начиная с адреса [[HERE]]
| |
| | |
| == Ввод слова WORD ==
| |
| В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите четыре клавиши [[Клавиша В↑|{{Серая клавиша|В↑}}]] [[Клавиша 5|{{Серая клавиша|5}}]] [[Клавиша ×|{{Серая клавиша|×}}]] [[Клавиша K|{{Синяя клавиша|K}}]]
| |
| | |
| == WORD в стандарте ANS Forth ==
| |
| <pre>
| |
| 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>
| |
| </pre>
| |
| | |
| == История ==
| |
| Слово WORD появилось в 1958 году в самой первой версии интерпретатора Форта, написанного Чак Муром на Фортране для IBM EDPM 704 для [https://ru.wikipedia.org/wiki/%D0%A1%D0%BC%D0%B8%D1%82%D1%81%D0%BE%D0%BD%D0%BE%D0%B2%D1%81%D0%BA%D0%B0%D1%8F_%D0%B0%D1%81%D1%82%D1%80%D0%BE%D1%84%D0%B8%D0%B7%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D0%BE%D0%B1%D1%81%D0%B5%D1%80%D0%B2%D0%B0%D1%82%D0%BE%D1%80%D0%B8%D1%8F САО]. Тогда оно ещё не называлось WORD, так как в то время команды Форта кодировались числами.
| |
| | |
| Важно, что первый WORD считывал для [[INTERPRET]] слова, разделённые пробелами. Подобный ввод в свободном формате был необычен для того времени, но более эффективным (компактней и быстрее) и надёжным. Фортрановский ввод был отформатирован в конкретные колонки и ошибки набора приводили к многочисленным задержкам.
| |
| | |
| Чак Мур отказался от слова WORD в {{colorForth}}, где вводимые слова не буферизуются в редактируемой строке, а исполняются сразу по нажатию клавиши «Пробел».
| |
| | |
| === WORD в предыдущем стандарте Forth-83 (англ.) ===
| |
| <pre>
| |
| 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"
| |
| </pre>
| |
| | |
| === 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 литерой.
| |
| <pre>
| |
| 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
| |
| </pre>
| |
| Реализация из SP-Forth 4.20:
| |
| <pre>
| |
| : 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
| |
| ;
| |
| </pre>
| |
| | |
| === Советская реализация ===
| |
| Описание и определение слова WORD в ядре ФОРТ-ЕС:
| |
| <PRE>
| |
| 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! ;
| |
| </PRE>
| |
| Определение слова WORD в FORTH ИТЭФ:
| |
| <PRE>
| |
| 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
| |
| </PRE>
| |
| | |
| == Ссылки ==
| |
| * {{Исходник|WORD|WORD}}
| |
| * Слово [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.2450 WORD] и [http://forth.sourceforge.net/standard/dpans/dpansa6.htm#A.6.1.2450 комментарий к нему] в стандарте ANS Forth ''(англ.)''
| |
| * Слово [http://forth-standard.org/standard/core/WORD WORD] и [http://forth-standard.org/standard/rationale#rat:core:WORD комментарий к нему] в черновике Forth 200x ''(англ.)''
| |
| * [http://www.ultratechnology.com/color4th.html «The word WORD is an anathema, it shouldn't exist.»] ''(англ.)'' — одно из первых сообщений Чака Мура о {{colorForth}} (26 июля 1997 года)
| |
| * [http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20STARTING%20FORTH\10.WWOD-WYWOD ВВОД-ВЫВОД] в книге [http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20STARTING%20FORTH Л.Броуди «Начальный курс программирования на языке Форт»]
| |
| * [http://www.forth.com/starting-forth/sf10/sf10.html I/O and You] в книге [http://www.forth.com/starting-forth/ Leo Brodie Starting Forth] ''(англ.)''
| |
| | |
|
| |
|
| {{нет иллюстраций}} | | {{нет иллюстраций}} |
| {{заготовка}} | | {{заготовка}} |
| [[Категория:Слова Каллисто]] | | [[Категория:Слова Каллисто]] |
| [[Категория:Слова высокого уровня]]
| |
| [[Категория:Интерпретация входного потока Каллисто]]
| |
| [[Категория:Стандартные слова]]
| |
| [[Категория:1994 CORE]]
| |
| [[Категория:2012 CORE]]
| |