Текущая версия |
Ваш текст |
Строка 1: |
Строка 1: |
| '''DIGIT''' (цифра) — архаичное слово [[Каллисто]]. | | '''DIGIT''' — стандартное слово [[Каллисто]]. |
| DIGIT ( c u1 −− u2 1 | 0 ) Цифра. Преобразовать литеру c в число u2, используя основание u1.
| |
| ASCII-DIGIT BASE => DIGIT-VALUE TRUE / FALSE
| |
| | |
| == Ввод слова DIGIT ==
| |
| В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите клавиши [[Клавиша K|{{Синяя клавиша|K}}]] [[Клавиша 7|{{Серая клавиша|7}}]] [[Клавиша БП|{{Чёрная клавиша|БП}}]] [[Клавиша 7|{{Серая клавиша|7}}]] [[Клавиша 2|{{Серая клавиша|2}}]]
| |
| | |
| == История ==
| |
| Хотя слово DIGIT не вошло ни в один из стандартов языка Форт, оно является одним из наиболее старых слов Форта. Слово DIGIT появилось в Форте в 1965 году, когда Чак Мур подрабатывал наёмным программистом в городе Нью-Йорк. Тогда появились миникомпьютеры, а с ними и терминалы. Интерпретатор был идеален для ввода с телетайпа и вскоре стал включать код для работы с выводом.
| |
| | |
| Из-за того, что слово DIGIT очень старое, оно возвращает в качестве истины 1 — хотя стандарт [[Каллисто]] это [[TRUE|-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, как истины:
| |
| <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 в ядре ФОРТ-ЕС. ЕС ЭВМ использовала кодировку [https://ru.wikipedia.org/wiki/%D0%94%D0%9A%D0%9E%D0%98-8 ДКОИ-8], в которой не все латинские буквы идут последовательно:
| |
| <PRE>
| |
| 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 ;
| |
| </PRE>
| |
| | |
| В FORTH ИТЭФ слово DIGIT тоже было [[примитив]]ом, вот его определение:
| |
| <PRE>
| |
| 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 ; "Успешный" выход
| |
| </PRE>
| |
| | |
| == Ссылки ==
| |
| * {{Исходник|DIGIT|DIGIT}}
| |
| * См. слова [[BASE]], [[NUMBER]], [[UCONVERT]] и [[U♯|U#]]
| |
| | |
|
| |
|
| {{нет иллюстраций}} | | {{нет иллюстраций}} |
| {{заготовка}} | | {{заготовка}} |
| [[Категория:Слова Каллисто]] | | [[Категория:Слова Каллисто]] |
| [[Категория:Примитивы]]
| |
| [[Категория:Архаичные слова]]
| |