NUMBER

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

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

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


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


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