Редактирование: NUMBER

Перейти к навигации Перейти к поиску
Внимание: Вы не вошли в систему. Ваш IP-адрес будет общедоступен, если вы запишете какие-либо изменения. Если вы войдёте или создадите учётную запись, её имя будет использоваться вместо IP-адреса, наряду с другими преимуществами.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий ниже, чтобы убедиться, что это нужная вам правка, и запишите страницу ниже, чтобы отменить правку.

Текущая версия Ваш текст
Строка 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:
[[Категория:Слова высокого уровня]]
[[Категория:Слова высокого уровня]]
[[Категория:Интерпретация входного потока Каллисто]]
[[Категория:Интерпретация входного потока Каллисто]]
[[Категория:Слова, способные вызывать авост приложения]]
[[Категория:Слова Каллисто без стековых диаграмм]]
[[Категория:Архаичные слова]]
Пожалуйста, учтите, что любой ваш вклад в проект «ПМК вики» может быть отредактирован или удалён другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. Pmkwiki:Авторские права). НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!

В целях защиты вики от автоматического спама в правках просим вас решить следующую каптчу:

Отменить Справка по редактированию (в новом окне)