NUMBER
NUMBER — архаичное слово Каллисто.
NUMBER ( a −− n ) Преобразовать строку в целое число n, начиная с a+1.
Преобразует в число последовательность литер, начиная с a+1 с учётом BASE.
Строка a может хранить собственную длину в первом байте. Подразумевается, что после числа всегда идёт пробел, а строчные буквы уже преобразованы в заглавные.
Ввод слова NUMBER[править]
В режиме ЛАТ последовательно нажмите клавиши 4 3 ÷ В/О ИП ×
История[править]
Слово NUMBER присутствует ещё в Форте−79, но у нас оно возвращает одну ячейку стека, а не двойную.
Слово NUMBER появилось в 1958 году в самой первой версии интерпретатора Форта, написанного Чак Муром на Фортране для IBM EDPM 704 для САО. Тогда оно ещё не называлось NUMBER, так как в то время команды Форта кодировались числами.
Первый NUMBER использовался словом INTERPRET для преобразования слов в двоичный вид, в данном случае чисел с плавающей запятой.
Слово NUMBER исключено из стандарта Форта 1994 года и его нет в черновике Форта-2012. Его реализация в Каллисто отлична от старых стандартов, т.к. возвращает лишь один элемент стека, а не числовую пару.
NUMBER в предыдущем стандарте Forth-83 (англ.)[править]
NUMBER addr -- d Convert the count and character string at addr, to a signed 32-bit integer, using the value of BASE . If numeric conversion is not possible, an error condition exists. The string may contain a preceding minus sign.
NUMBER в стандарте Forth-79 (англ.)[править]
NUMBER addr -- n Convert the count and character string at addr, to a signed 32-bit integer, using the current base. If numeric conversion is not possible, an error condition exists. The string may contain a preceding negative sign.
NUMBER в fig-FORTH Release 1 glossary, май 1979 (англ.)[править]
NUMBER addr --- d Convert a character string left at addr with a preceeding count, to a signed .double number, using the current numeric base. If a decimal point is encountered in the text, its position will be given in DPL, but no other effect occurs. If numeric conversion is not possible, an error message will be given.
Реализация[править]
При обработке символьного литерала 'c' слово NUMBER считывает значение литеры из старшего байта переменной SAVIN. Туда код литеры попадает из слова INTERPRET — до того, как все буквы в имени слова переведутся в заглавные.
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, если выключена обработка ошибок
Советская реализация[править]
Описание и определение слова NUMBER в ядре ФОРТ-ЕС:
NUMBER + T->WD ПРЕОБРАЗОВАТЬ СТРОКУ Т В ЧИСЛО WD 39 Экран номер 39 ( 31.03.86 DIGIT CONVERT NUMBER ) : NUMBER ( T->WD ) 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 ;
Определение слов (NUMBER) и NUMBER в FORTH ИТЭФ:
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
Ссылки[править]
- Исходный текст слова NUMBER в Каллисто Классик 1.0
- См. слова INTERPRET, BASE, UCONVERT, LITERAL, FLITERAL, FL, DPL и EE
- ОСНОВЫ ФОРТА в книге Л.Броуди «Начальный курс программирования на языке Форт»
- ЧИСЛО ТИПОВ ЧИСЕЛ в книге Л.Броуди «Начальный курс программирования на языке Форт»
- ВВОД-ВЫВОД в книге Л.Броуди «Начальный курс программирования на языке Форт»
- Fundamental Forth в книге Leo Brodie Starting Forth (англ.)
- A Number of Kinds of Numbers в книге Leo Brodie Starting Forth (англ.)
- I/O and You в книге Leo Brodie Starting Forth (англ.)
У этой статьи нет иллюстраций. Вы можете помочь проекту, добавив их. |
Это заготовка статьи. Вы можете помочь проекту, дополнив её. |