UCONVERT

Материал из ПМК вики
Перейти к: навигация, поиск

UCONVERT — фортовское слово Каллисто. Преобразовать последовательность цифр в целое, с учётом BASE.

UCONVERT       ( u a −− u1 a1 )                     Преобразовать u и литеры от a+1 в u1 и a1 −− адрес первой не цифры.

Ввод слова UCONVERT[править]

В режиме ЛАТ последовательно нажмите клавиши  3   С/П   5   4      ИП   ×   2 

CONVERT в стандарте ANS Forth[править]

 6.2.0970   CONVERT                                                     CORE EXT
            ( ud1 c-addr1 -- ud2 c-addr2 )
            ud2 - результат преобразования символов в пределах текста 
            начинающегося с первого символа после c-addr1 в цифры, используя 
            число из BASE, и добавление каждой цифры в ud1 после умножения ud1 
            на число из BASE. Преобразование продолжается до встречи с не 
            преобразуемым символом. c-addr2 - адрес ячейки первого не 
            преобразованного символа. Неопределенная ситуация существует, если 
            ud2 переполняется.

        Примечание: Это слово устаревшее и включено как уступка существующим 
            реализациям. Его функция заменена на 6.1.0570 >NUMBER.

        См.: 3.2.1.2 Преобразование цифр.

 A.6.2.0970   CONVERT
 CONVERT может быть определено следующим образом:

        : CONVERT   CHAR+ 65535 >NUMBER DROP ;

История[править]

В стандарте Форта 1994 года слово CONVERT было определено, как устаревшее. Его нет в черновике стандарта 200x года. Эволюция Форта привела к победе слова >NUMBER — в котором явно указана максимальная длина строки для преобразования.

Каллистянское слово UCONVERT нестандартное, т.к. в стандарте Форт-94 вместо u прописана пара чисел ud1.

CONVERT в предыдущем стандарте Forth-83 (англ.)[править]

     CONVERT      +d1 addr1 -- +d2 addr2        79
          +d2 is the result of converting the characters within the
          text beginning at addr1+1 into digits, using the value of
          BASE , and accumulating each into +d1 after multiplying +d1
          by the value of BASE .  Conversion continues until an
          unconvertible character is encounter.  addr2 is the location
          of the first unconvertible character.

CONVERT в стандарте Forth-79 (англ.)[править]

CONVERT        d1 addr1 -- d2 addr2          195
    Convert  to the equivalent stack number the text beginning  at
    addr1+1  with regard to BASE.   The new value  is  accumulated
    into double number d1, being left as d2.  addr2 is the address
    of the first non-convertible character.

(NUMBER) в fig-FORTH Release 1 glossary, май 1979 (англ.)[править]

(NUMBER)       d1 addr1 --- d2 addr2
       Convert the ascii text beginning at addr1+l with regard to BASE. The
       new value is accumulated into double number d1, being left as d2.
       Addr2 is the address of the first unconvertable digit. Used by
       NUMBER.

Реализация[править]

3183 ;#UCONVERT
3184 ; UCONVERT         ( u a −− u1 a1 )                     Преобразовать u и литеры от a+1 в u1 и a1 −− адрес первой не цифры.
3185 LPNUMB:         .DB     8
3186                 .TEXT   "UCONVERT"
3187                 .DW     LWORD
3188 PNUMB:          .DW CALL
3189 BN:             .DW ONEP, DUP,TOR, CAT, BASE,UAT, DIGIT, ZBRAN,MMO
3190                 .DW SWAP, BASE,UAT,STAR, PLUS
3191                 .DW DPL,AT, ONEP, ZBRAN,BN1, ONE,DPL,PSTOR      ; Увеличить DPL на единицу, если там не −1
3192 BN1:            .DW FROMR, BRAN,BN
3193 MMO:            .DW FROMR, EXIT

Реализация из SP-Forth 4.20:

: >NUMBER ( ud1 c-addr1 u1 -- ud2 c-addr2 u2 ) \ 94
\ ud2 - результат преобразования символов строки, заданной c-addr1 u1,
\ в цифры, используя число в BASE, и добавлением каждой к ud1 после
\ умножения ud1 на число в BASE. Преобразование продолжается слева
\ направо до первого непреобразуемого символа, включая символы "+" и "-",
\ или до полного преобразования строки.
\ c-addr2 - адрес первого непреобразумого символа или первого символа
\ за концом строки, если строка была полностью преобразована.
\ u2 - число непреобразованных символов в строке.
\ Неоднозначная ситуация возникает, если ud2 переполняется во время
\ преобразования.
  BEGIN
    DUP
  WHILE
    >R
    DUP >R
    C@ BASE @ DIGIT 0=     \ ud n flag
    IF R> R> EXIT THEN     \ ud n  ( ud = udh udl )
    SWAP BASE @ UM* DROP   \ udl n udh*base
    ROT BASE @ UM* D+      \ (n udh*base)+(udl*baseD)
    R> CHAR+ R> 1-
  REPEAT
;

Советская реализация[править]

Описание и определение слова CONVERT в ядре ФОРТ-ЕС:

CONVERT   WD1,A1,->WD2,A2 ПРЕОБРАЗОВАТЬ WD1 И ЛИТЕРЫ            39
          ОТ А1+1 В WD2 И А2 - АДРЕС 1-ОЙ НЕ ЦИФРЫ

                     Экран номер 39
( 31.03.86      DIGIT CONVERT  NUMBER )

: CONVERT ( WD1,AI->WD2,A2)
 BEGIN 1+ DUP >R C@ BASE @ DIGIT WHILE
    SWAP BASE @ UM* DROP ROT BASE @ UM* D+
    DPL @ 1+ IF DPL 1+! THEN R> REPEAT R> ;

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


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


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