Текущая версия |
Ваш текст |
Строка 1: |
Строка 1: |
| '''NUMBER''' — архаичное слово [[Каллисто]]. | | '''NUMBER''' — стандартное слово [[Каллисто]]. |
| NUMBER ( a −− n ) Преобразовать строку в целое число n, начиная с a+1.
| |
| Преобразует в число последовательность [[Знакогенератор|литер]], начиная с a+1 с учётом [[BASE]].
| |
|
| |
|
| Строка a может хранить собственную длину в первом байте. Подразумевается, что после числа всегда идёт [[пробел]], а строчные буквы уже [[UPPER|преобразованы в заглавные]].
| | Преобразует в число последовательность символов, начиная с a+1 с учётом [[BASE]]. |
|
| |
|
| == Ввод слова NUMBER == | | == Ввод слова NUMBER == |
| В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите клавиши [[Клавиша 4|{{Серая клавиша|4}}]] [[Клавиша 3|{{Серая клавиша|3}}]] [[Клавиша ÷|{{Серая клавиша|÷}}]] [[Клавиша В/О|{{Чёрная клавиша|В/О}}]] [[Клавиша ИП|{{Чёрная клавиша|ИП}}]] [[Клавиша ×|{{Серая клавиша|×}}]] | | В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите клавиши [[Клавиша 4|{{Серая клавиша|4}}]] [[Клавиша 3|{{Серая клавиша|3}}]] [[Клавиша ÷|{{Серая клавиша|÷}}]] [[Клавиша В/О|{{Чёрная клавиша|В/О}}]] [[Клавиша ИП|{{Чёрная клавиша|ИП}}]] [[Клавиша ×|{{Серая клавиша|×}}]] |
|
| |
|
| == История ==
| | == NUMBER в предыдущем стандарте Forth-83 (англ.) == |
| Слово NUMBER присутствует ещё в Форте−79, но у нас оно возвращает одну ячейку стека, а не двойную.
| |
| | |
| Слово NUMBER появилось в 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 САО]. Тогда оно ещё не называлось NUMBER, так как в то время команды Форта кодировались числами.
| |
| | |
| Первый NUMBER использовался словом [[INTERPRET]] для преобразования слов в двоичный вид, в данном случае чисел с плавающей запятой.
| |
| | |
| Слово NUMBER исключено из стандарта Форта 1994 года и его нет в черновике Форта-2012. Его реализация в [[Каллисто]] отлична от старых стандартов, т.к. возвращает лишь один элемент стека, а не числовую пару.
| |
| | |
| === NUMBER в предыдущем стандарте Forth-83 (англ.) ===
| |
| NUMBER addr -- d | | NUMBER addr -- d |
| Convert the count and character string at addr, to a signed | | Convert the count and character string at addr, to a signed |
Строка 24: |
Строка 13: |
| string may contain a preceding minus sign. | | string may contain a preceding minus sign. |
|
| |
|
| === NUMBER в стандарте Forth-79 (англ.) ===
| | == NUMBER в стандарте Forth-79 (англ.) == |
| NUMBER addr -- n | | NUMBER addr -- n |
| Convert the count and character string at addr, to a signed | | Convert the count and character string at addr, to a signed |
Строка 31: |
Строка 20: |
| contain a preceding negative sign. | | contain a preceding negative sign. |
|
| |
|
| === NUMBER в fig-FORTH Release 1 glossary, май 1979 (англ.) ===
| | == NUMBER в fig-FORTH Release 1 glossary, май 1979 (англ.) == |
| NUMBER addr --- d | | NUMBER addr --- d |
| Convert a character string left at addr with a preceeding count, to | | Convert a character string left at addr with a preceeding count, to |
Строка 39: |
Строка 28: |
| not possible, an error message will be given. | | not possible, an error message will be given. |
|
| |
|
| == Реализация == | | == История == |
| При обработке символьного литерала 'c' слово NUMBER считывает значение литеры из старшего байта переменной [[SAVIN]]. Туда код литеры попадает из слова [[INTERPRET]] — до того, как [[UPPER|все буквы в имени слова переведутся в заглавные]].
| | Слово NUMBER появилось в 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 САО]. Тогда оно ещё не называлось NUMBER, так в то время команды Форта кодировались числами. |
| <pre>
| |
| 3211 ;#NUMBER
| |
| 3212 ; NUMBER ( a −− n ) Преобразовать строку в целое число n, начиная с a+1.
| |
| 3213 ; Преобразовать в число последовательность литер, начиная с a+1 с учётом BASE,
| |
| 3214 ; Байт с адресом a может содержать число литер в строке.
| |
| 3215 ; Подразумевается, что после числа всегда идёт пробел, а строчные буквы уже преобразованы в заглавные.
| |
| 3216 ; При обработке 'c' литера берётся из старшего байта переменной SAVIN
| |
| 3217 ; Слово присутствует ещё в Форте−79, но у нас оно возвращает одну ячейку стека, а не двойную.
| |
| 3218 LNUMB: .DB 6
| |
| 3219 .TEXT "NUMBER" ; ( адрес −− число )
| |
| 3220 .DW LFIND
| |
| 3221 NUMB: .DW CALL, SEXP,ZSTORE ; Обнулить порядок
| |
| 3222 .DW TRUE,DPL,STORE ; DPL := −1
| |
| 3223 .DW BASE,UAT, ZERO, ROT ; 0 значит положительное число
| |
| 3224 .DW ONEP,DUP, CAT
| |
| 3225 .DW DUP,LITB
| |
| 3226 .DB 39 ; "'"
| |
| 3227 .DW EQUAL, ZBRAN,NH2
| |
| 3228 .DW DROP, SAVIN,CAT, SWAP, TWOP ; Считать литеру из старшего байта SAVIN
| |
| 3229 .DW DUP, CAT, LITB
| |
| 3230 .DB 39 ; "'"
| |
| 3231 .DW SUB, ZBRAN,NH21
| |
| 3232 .DW DROP, BRAN,ER2
| |
| 3233 NH21: .DW ONEP,CAT, BL,EQUAL, ZBRAN,ER2
| |
| 3234 NH22: .DW ROT,ROT, DDROP, EXIT ; Выход, литера определена
| |
| 3235 NH2: .DW DUP, LITB
| |
| 3236 .DB 35 ; "#"
| |
| 3237 .DW EQUAL, ZBRAN,NH01
| |
| 3238 .DW DROP, DEC, BRAN,NH03 ; Десятичное число
| |
| 3239 NH01: .DW DUP, LITB
| |
| 3240 .DB 36 ; "$"
| |
| 3241 .DW EQUAL, ZBRAN,NH02
| |
| 3242 .DW DROP, HEX, BRAN,NH03 ; Шестнадцатеричное число
| |
| 3243 NH02: .DW LITB
| |
| 3244 .DB 37 ; "%"
| |
| 3245 .DW EQUAL, ZBRAN,NH04
| |
| 3246 .DW TWO,BASE,STORE ; Двоичное число
| |
| 3247 NH03: .DW ONEP
| |
| 3248 NH04: .DW DUP,CAT, LITB
| |
| 3249 .DB 45 ; "−"
| |
| 3250 .DW EQUAL, ZBRAN,NH3
| |
| 3251 .DW SWAP,ONEP, SWAP,ONEP ; 1 значит отрицательное число
| |
| 3252 NH3: .DW ONEM
| |
| 3253 NH4: .DW ZERO, SWAP, PNUMB
| |
| 3254 .DW DUP,CAT, BL,SUB, ZBRAN,NH6
| |
| 3255 .DW DUP,CAT, LITB
| |
| 3256 .DB 44 ; ","
| |
| 3257 .DW EQUAL, ZBRAN,NEXP
| |
| 3258 .DW DPL,ZSTORE, PNUMB, DUP,CAT, BL,SUB, ZBRAN,NH6
| |
| 3259 NEXP: .DW DPL,AT, ZERO,MAX, SWAP ; Теперь числа с E, но без запятой ловятся по DPL
| |
| 3260 .DW DUP,CAT, LITB
| |
| 3261 .DB 69 ; "E"
| |
| 3262 .DW EQUAL, ZBRAN,ER1
| |
| 3263 .DW ONEP, DUP,CAT, LITB
| |
| 3264 .DB 45 ; "−"
| |
| 3265 .DW EQUAL, ZBRAN,NEMI, ONE, BRAN,NH0
| |
| 3266 NEMI: .DW ONEM, ZERO
| |
| 3267 NH0: .DW SWAP,ZERO,SWAP, PNUMB, CAT, BL,EQUAL, ZBRAN,ER
| |
| 3268 .DW SWAP, ZBRAN,NH5, NEGATE ; Если был "−", изменить знак порядка
| |
| 3269 NH5: .DW SEXP,STORE, DPL,STORE, ZERO
| |
| 3270 NH6: .DW DROP, SWAP, ZBRAN,NH7, NEGATE ; Если был "−", изменить знак числа
| |
| 3271 NH7: .DW SWAP, BASE, DUP,UAT,SAVIN,STORE, STORE, EXIT
| |
| 3272 ER: .DW DROP
| |
| 3273 ER1: .DW DDROP
| |
| 3274 ER2: .DW DDROP
| |
| 3275 .DW BASE, DUP,UAT,SAVIN,STORE, STORE,ZERO,ERROR ; Восстановить систему счисления при ошибке
| |
| 3276 .DW ZERO, EXIT ; Возвратить 0, если выключена обработка ошибок
| |
| </pre>
| |
| | |
| === Советская реализация ===
| |
| Описание и определение слова NUMBER в ядре ФОРТ-ЕС:
| |
| <PRE>
| |
| NUMBER + T->WD ПРЕОБРАЗОВАТЬ СТРОКУ Т В ЧИСЛО WD 39
| |
| | |
| Экран номер 39
| |
| ( 31.03.86 DIGIT CONVERT NUMBER )
| |
|
| |
|
| : NUMBER ( T->WD )
| | NUMBER использовался словом [[INTERPRET]] для преобразования слов в двоичный вид, в данном случае чисел с плавающей запятой. |
| 0 0 ROT DUP >R COUNT OVER + OVER С@ С" - =
| |
| DUP >R SWAP >R IF ELSE 1- THEN -1
| |
| BEGIN DPL ! CONVERT DUP R@ < WHILE DUP С@
| |
| С" . <> IF RDROP RDROP R> BADWORD THEN 0
| |
| REPEAT DROP RDROP R> IF DNEGATE THEN RDROP ;
| |
| </PRE>
| |
| Определение слов (NUMBER) и NUMBER в FORTH ИТЭФ:
| |
| <PRE>
| |
| HEAD 210Q,'(NUMBER',251Q,PNUMB,$COL ; (NUMBER)
| |
| BN: DW ONEP,TOR,I,CAT,BASE,AT,DIGIT,ZBRAN,MMO-$
| |
| DW SWAP,BASE,AT,USTAR,DROP,ROT,BASE,AT,USTAR
| |
| DW DPLUS,DPL,AT,ONEP,ZBRAN,BN1-$,ONE,DPL,PSTOR
| |
| BN1: DW FROMR,BRAN,BN-$
| |
| MMO: DW FROMR,SEMI
| |
| ...
| |
| HEAD 206Q,'NUMBE',322Q,NUMB,$COL ; NUMBER
| |
| DW ZERO,$EX,STORE,BASE,AT,ZERO,ROT
| |
| DW ONEP,DUBL,CAT,DUBL,LIT,53Q,EQUAL
| |
| DW ZBRAN,NH1-$,DEC,DROP,BRAN,NH4-$
| |
| NH1: DW DUBL,LIT,55Q,EQUAL,ZBRAN,NH2-$,DROP,DEC
| |
| DW SWAP,DROP,ONE,SWAP,BRAN,NH4-$
| |
| NH2: DW LIT,47Q,EQUAL,ZBRAN,NH3-$,OCTAL,ONEP
| |
| NH3: DW ONEM
| |
| NH4: DW LIT,-1,DPL,STORE,ZERO,ZERO,ROT,PNUMB,DUBL
| |
| DW CAT,BLAN,SUB,ZBRAN,NH6-$
| |
| DW DUBL,CAT,LIT,56Q,EQUAL,ZBRAN,EXP-$
| |
| DW ZERO,DPL,STORE,PNUMB,DUBL,CAT,BLAN,SUB,ZBRAN,NH6-$
| |
| EXP: DW DPL,AT,SWAP,DUBL,CAT,LIT
| |
| DW 105Q,EQUAL,ZBRAN,ER1-$,ONEP,DUBL,CAT
| |
| DW LIT,55Q,EQUAL,ZBRAN,NEMI-$,ONE,BRAN,NH0-$
| |
| NEMI: DW DUBL,CAT,LIT,53Q,SUB,ZBRAN,PLU-$,ONEM
| |
| PLU: DW ZERO
| |
| NH0: DW SWAP,ZERO,ZERO,ROT,PNUMB,CAT,BLAN,EQUAL,ZBRAN,ER-$
| |
| DW DROP,SWAP,ZBRAN,NH5-$,MINUS
| |
| NH5: DW $EX,STORE,DPL,STORE,ZERO
| |
| NH6: DW DROP,ROT,ZBRAN,NH7-$,DMINU
| |
| NH7: DW ROT,BASE,STORE,SEMI
| |
| ER: DW DDROP,DROP
| |
| ER1: DW DDROP,DDROP,DROP,ZERO,ERROR,SEMI
| |
| </PRE>
| |
|
| |
|
| == Ссылки == | | == Ссылки == |
| * {{Исходник|NUMBER|NUMBER}}
| |
| * См. слова [[INTERPRET]], [[BASE]], [[UCONVERT]], [[LITERAL]], [[FLITERAL]], [[FL]], [[DPL]] и [[Слово EE|EE]]
| |
| * [http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20STARTING%20FORTH\01.OSNOWY%20FORTA ОСНОВЫ ФОРТА] в книге [http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20STARTING%20FORTH Л.Броуди «Начальный курс программирования на языке Форт»] | | * [http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20STARTING%20FORTH\01.OSNOWY%20FORTA ОСНОВЫ ФОРТА] в книге [http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20STARTING%20FORTH Л.Броуди «Начальный курс программирования на языке Форт»] |
| * [http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20STARTING%20FORTH\07.TISLO%20TIPOW%20TISEL ЧИСЛО ТИПОВ ЧИСЕЛ] в книге [http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20STARTING%20FORTH Л.Броуди «Начальный курс программирования на языке Форт»] | | * [http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20STARTING%20FORTH\07.TISLO%20TIPOW%20TISEL ЧИСЛО ТИПОВ ЧИСЕЛ] в книге [http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20STARTING%20FORTH Л.Броуди «Начальный курс программирования на языке Форт»] |
Строка 176: |
Строка 47: |
| [[Категория:Слова высокого уровня]] | | [[Категория:Слова высокого уровня]] |
| [[Категория:Интерпретация входного потока Каллисто]] | | [[Категория:Интерпретация входного потока Каллисто]] |
| [[Категория:Слова, способные вызывать авост приложения]] | | [[Категория:Слова Каллисто без стековых диаграмм]] |
| [[Категория:Архаичные слова]]
| |