DIGIT: различия между версиями

Материал из ПМК вики
Перейти к навигации Перейти к поиску
 
(не показано 15 промежуточных версий этого же участника)
Строка 1: Строка 1:
'''DIGIT''' (цифра) — стандартное слово [[Каллисто]].
'''DIGIT''' (цифра) — архаичное слово [[Каллисто]].
  DIGIT          ( c u1 −− u2 1 | 0 )                Цифра. Преобразовать литеру c в число u2, используя основание u1.
  DIGIT          ( c u1 −− u2 1 | 0 )                Цифра. Преобразовать литеру c в число u2, используя основание u1.
ASCII-DIGIT BASE => DIGIT-VALUE TRUE / FALSE
ASCII-DIGIT BASE => DIGIT-VALUE TRUE / FALSE
Строка 6: Строка 6:
В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите клавиши [[Клавиша K|{{Синяя клавиша|K}}]] [[Клавиша 7|{{Серая клавиша|7}}]] [[Клавиша БП|{{Чёрная клавиша|БП}}]] [[Клавиша 7|{{Серая клавиша|7}}]] [[Клавиша 2|{{Серая клавиша|2}}]]
В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите клавиши [[Клавиша K|{{Синяя клавиша|K}}]] [[Клавиша 7|{{Серая клавиша|7}}]] [[Клавиша БП|{{Чёрная клавиша|БП}}]] [[Клавиша 7|{{Серая клавиша|7}}]] [[Клавиша 2|{{Серая клавиша|2}}]]


== DIGIT в fig-FORTH Release 1 glossary, май 1979 (англ.) ==
== История ==
Хотя слово DIGIT не вошло ни в один из стандартов языка Форт, оно является одним из наиболее старых слов Форта. Слово DIGIT появилось в Форте в 1965 году, когда Чак Мур подрабатывал наёмным программистом в городе Нью-Йорк. Тогда появились миникомпьютеры, а с ними и терминалы. Интерпретатор был идеален для ввода с телетайпа и вскоре стал включать код для работы с выводом.
 
Из-за того, что слово DIGIT очень старое, оно возвращает в качестве истины 1 — хотя стандарт [[Каллисто]] это [[TRUE|-1]]. Разное количество аргументов на стеке — опасная практика, от которой тоже уже давно отказались.
 
=== DIGIT в fig-FORTH Release 1 glossary, май 1979 (англ.) ===
  DIGIT          c n1 --- n2 tf (ok) c n1 --- ff (bad)
  DIGIT          c n1 --- n2 tf (ok) c n1 --- ff (bad)
         Converts the ascii character c (using base n1) to its binary
         Converts the ascii character c (using base n1) to its binary
Строка 12: Строка 17:
         invalid, leaves only a false flag.
         invalid, leaves only a false flag.


== История ==
== Реализация ==
Хотя слово DIGIT не включено ни в один из стандартов языка Форт, оно является одним из наиболее старых слов Форта. Слово DIGIT появилось в Форте в 1965 году, когда Чак Мур подрабатывал наёмным программистом в городе Нью-Йорк. Тогда появились миникомпьютеры, а с ними и терминалы. Интерпретатор был идеален для ввода с телетайпа и вскоре стал включать код для работы с выводом.
В [[Каллисто|Каллисто 1.0]] слово DIGIT использует устаревшее значение 1, как истины:
<pre>
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
</pre>
Реализации из SP-Forth 4.20:
<pre>
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
</pre>
<pre>
\ : 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
;)
</pre>


== Реализация ==
=== Советская реализация ===
Описание и определение слова DIGIT в ядре ФОРТ-ЕС:
Описание и определение слова DIGIT в ядре ФОРТ-ЕС. ЕС ЭВМ использовала кодировку [https://ru.wikipedia.org/wiki/%D0%94%D0%9A%D0%9E%D0%98-8 ДКОИ-8], в которой не все латинские буквы идут последовательно:
<PRE>
<PRE>
DIGIT    * C,N1->N2,TP/FF    N2 - ЗНАЧЕНИЕ ЛИТЕРЫ С КАК  39
DIGIT    * C,N1->N2,TP/FF    N2 - ЗНАЧЕНИЕ ЛИТЕРЫ С КАК  39
Строка 49: Строка 124:
== Ссылки ==
== Ссылки ==
* {{Исходник|DIGIT|DIGIT}}
* {{Исходник|DIGIT|DIGIT}}
* См. слова [[BASE]], [[NUMBER]], [[UCONVERT]] и [[U♯|U#]]




Строка 55: Строка 131:
[[Категория:Слова Каллисто]]
[[Категория:Слова Каллисто]]
[[Категория:Примитивы]]
[[Категория:Примитивы]]
[[Категория:Архаичные слова]]

Текущая версия от 18:18, 10 ноября 2017

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    ; "Успешный" выход

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


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


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