DIGIT

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

DIGIT (цифра) — архаичное слово Каллисто.

DIGIT          ( c u1 −− u2 1 | 0 )                 Цифра. Преобразовать литеру c в число u2, используя основание u1.

ASCII-DIGIT BASE => DIGIT-VALUE TRUE / FALSE

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

В режиме ЛАТ последовательно нажмите клавиши  K   7   БП   7   2 

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

Хотя слово DIGIT не вошло ни в один из стандартов языка Форт, оно является одним из наиболее старых слов Форта. Слово DIGIT появилось в Форте в 1965 году, когда Чак Мур подрабатывал наёмным программистом в городе Нью-Йорк. Тогда появились миникомпьютеры, а с ними и терминалы. Интерпретатор был идеален для ввода с телетайпа и вскоре стал включать код для работы с выводом.

Из-за того, что слово DIGIT очень старое, оно возвращает в качестве истины 1 — хотя стандарт Каллисто это -1. Разное количество аргументов на стеке — опасная практика, от которой тоже уже давно отказались.

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

DIGIT           c n1 --- n2 tf (ok) c n1 --- ff (bad)
       Converts the ascii character c (using base n1) to its binary
       equivalent n2, accompanied by a true flag. If the conversion is
       invalid, leaves only a false flag.

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

В Каллисто 1.0 слово DIGIT использует устаревшее значение 1, как истины:

 795 ;#DIGIT
 796 ; DIGIT            ( c u1 −− u2 1 | 0 )                 Цифра. Преобразовать литеру c в число u2, используя основание u1.
 797 ; ASCII−DIGIT BASE => DIGIT−VALUE TRUE / FALSE
 798 ; Признаёт только заглавные буквы
 799 ; Здесь в качестве истины возвращается 1, хотя Каллисто перешло на стандарт −1/0
 800 LDIGIT:         .DB     5
 801                 .TEXT   "DIGIT"                 ; ( литера основание −− значение 1 | 0 )
 802                 .DW     LPFIND
 803 DIGIT:          .DW     JDIGIT
…
 854 JDIGIT:                                         ; Обработчик DIGIT
 855                 RM3 MA                          ; [RA] == BASE
 856                 1 + M3
 857                 PKRM03 48 −  FX>=0 STF          ; Правильная цифра = ASCII − 48
 858                 MB 10 −  FX>=0 MO9              ; Если >9
 859                 3 + MB
 860                 10 −  FX>=0 STF
 861 MO9:            RMB KRMA −  FX<0 STF            ; Если не меньше BASE, то ошибка
 862                 RMB PKM03                       ; Записать цифру в стек, "успешный" выход
 863 JONE:                                           ; Обработчик 1
 864                 1 KM3  KGOTO9
…
 877 STF:            Cx PKM03  KGOTO9                ; [SP] := 0; NEXT

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

CODE DIGIT ( char n1 -- n2 true | false )
\ n2 - значение литеры char как
\ цифры в системе счисления по основанию n1
       MOV ECX, EAX
       MOV EAX, [EBP]
       A;  2C C, 30 C,  \  SUB AL, # 30
       JC SHORT @@1
       A;  3C C, A C,   \  CMP AL, # A
       JNC SHORT @@2
@@3:   CMP AL, CL
       JNC SHORT @@1
       MOV [EBP], EAX
       A; B8 C, TRUE W, TRUE W,  \  MOV EAX, # -1
       RET

@@2:   A;  3C C, 11 C,  \  CMP AL, # 11
       JC SHORT @@1
       A;  2C C, 7 C,   \  SUB AL, # 7
       JMP SHORT @@3

@@1:   LEA EBP, 4 [EBP]
       XOR EAX, EAX
       RET
END-CODE
\ : DIGIT ( C, N1 -> N2, TF / FF ) 
\ N2 - значение литеры C как
\ цифры в системе счисления по основанию N1
(  SWAP
  DUP 58 <
      OVER 47 > AND
      IF \ within 0..9
         48 -
      ELSE
         DUP 64 >
         IF
           DUP 96 > IF 87 ELSE 55 THEN -
         ELSE 2DROP 0 EXIT THEN
      THEN
   TUCK > DUP 0= IF NIP THEN
;)

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

Описание и определение слова DIGIT в ядре ФОРТ-ЕС. ЕС ЭВМ использовала кодировку ДКОИ-8, в которой не все латинские буквы идут последовательно:

DIGIT     * C,N1->N2,TP/FF    N2 - ЗНАЧЕНИЕ ЛИТЕРЫ С КАК   39
               ЦИФРЫ В СИСТЕМЕ СЧИСЛЕНИЯ ПО ОСНОВАНИЮ N1

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

: DIGIT ( C,N1->N2,TF/FF) 0 ROT ROT 0
 DO I ALPHA OVER ─ IF 2DROP I -1 0 LEAVE THEN LOOP DROP ;

В FORTH ИТЭФ слово DIGIT тоже было примитивом, вот его определение:

             HEAD    205Q,'DIGI',324Q,DIGIT               ; DIGIT
   ; ASCII-DIGIT BASE=>DIGIT-VALUE TRUE (FALSE)
             POP   AX      ; AX=BASE
             POP   CX
             SUB   CX, 60Q ; VALID DIGIT = ASCII-60
             JL    FALSE
             CMP   CX, 9   ; Если >9
             JLE   M09
             SUB   CX, 7
             CMP   CX, 10
             JL    FALSE
   M09:      CMP   CX, AX  ; Если не меньше BASE, то ошибка
             JGE   FALSE
             PUSH  CX      ; Запись цифры в стек
             JMP   TRUE    ; "Успешный" выход

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


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


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