CONSTANT
CONSTANT (константа) — стандартное порождающее слово Каллисто.
CONSTANT ( D −− ) Определить следующее слово, как константу со значением D.
Определить следующее слово, как 16-битную целочисленную константу со значением D.
Ввод слова CONSTANT[править]
В режиме ЛАТ последовательно нажмите клавиши С/П 5 4 1 2 ШГ← 4 2
CONSTANT в стандарте ANS Forth[править]
6.1.0950 CONSTANT CORE ( x "<spaces>name" -- ) Пропускает ведущие разделители пробелы. Выделяет name, ограниченное пробелом. Создает определение для name с семантикой выполнения, определенной ниже. name объявляется как "constant". name Выполнение: ( -- x ) Размещает x на стеке. См.: 3.4.1 Синтаксический анализ. A.6.1.0950 CONSTANT Типичное использование: ... DECIMAL 10 CONSTANT TEN ...
История[править]
CONSTANT является одним из самых древних сохранившихся слов Форта.
В 1968 году Чак Мур работал в Mohasco Industries, Inc (Amsterdam NY, англ.). Первая версия интерпретатора, получившая название FORTH, заработала на миникомпьютере IBM 1130 с графическим дисплеем 2250 (16-битный процессор с ОЗУ 8К, дисководом, клавиатурой, принтером и ридером/панчером перфокарт). Первый FORTH знал слово CONSTANT
Пример, приведённый в публикации Чака Мура 1970 года для 2К×48бит версии Форта на Burroughs B-5500 может быть выполнен сегодня на Каллисто (англ.):
The phrase 7 CONSTANT N will assign 1 cell to hold the constant 7. When N is seen 7 will be placed on the stack.
CONSTANT в предыдущем стандарте Forth-83 (англ.)[править]
CONSTANT 16b -- M,83 A defining word executed in the form: 16b CONSTANT <name> Creates a dictionary entry for <name> so that when <name> is later executed, 16b will be left on the stack.
CONSTANT в стандарте Forth-79 (англ.)[править]
CONSTANT n -- 185 A defining word used in the form: n CONSTANT <name> to create a dictionary entry for <name>, leaving n in its parameter field. When <name> is later executed, n will be left on the stack.
CONSTANT в fig-FORTH Release 1 glossary, май 1979 (англ.)[править]
CONSTANT n --- L0 A defining word used in the form: n CONSTANT cccc to create word cccc, with its parameter field containing n. When cccc is later executed, it will push the value of n to the stack.
Реализация[править]
Создающая часть слова CONSTANT является высокоуровневой. Для скорости обработчик констант написан на языке МК.
Также в теле словарной статьи CONSTANT присутствует обработчик SCONP для констант в памяти программ.
Если вам нужна десятичная константа, похожую функциональность может обеспечить слово VALUE.
594 PLUSKM3M: + ; Код повторно используется обработчиком CONSTANT 595 KM3 ; PUSH MEMW[RI++] 596 32768 − KX>=09 ; Если число положительное, NEXT 597 FANS − PKM03 KGOTO9 ; Обработка отрицательных чисел, NEXT … 2517 ;#CONSTANT 2518 ; CONSTANT ( D −− ) Определить следующее слово, как константу со значением D. 2519 ; Константы в памяти двоичных данных всегда 16−битные со знаком. 2520 ; Мы избавились от констант в памяти программ, реализовав их быстрыми примитивами. 2521 LCON: .DB 8 2522 .TEXT "CONSTANT" ; ( x "<пр>имя" −− ) 2523 .DW LSMI 2524 CON: .DW CALL 2525 RCON: .DW CREAT, COMMA, PSCOD 2526 SCOND: RM7 1 + M5 ; ( −− x ) из памяти данных 2527 KRM5 RME ∗ KRM5 2528 PGOTO PLUSKM3M 2529 SCONP: RM7 3 + KPRGM ; ( −− x ) в памяти программ всегда беззнаковые 2530 FANS 1 − KPRGM RME ∗ + KM3 KGOTO9
Реализации в SP-Forth 4.20[править]
0 VALUE CONSTANT-CODE … CODE _CONSTANT-CODE LEA EBP, -4 [EBP] MOV [EBP], EAX POP EAX MOV EAX, [EAX] RET END-CODE ' _CONSTANT-CODE TO CONSTANT-CODE … ' _CONSTANT-CODE >VIRT VALUE CONSTANT-CODE … : CONSTANT ( x "<spaces>name" -- ) \ 94 [T] HEADER [I] CONSTANT-CODE COMPILE, , ;
USER LAST-CFA … VECT SHEADER : SHEADER1 ( addr u -- ) HERE 0 , ( cfa ) DUP LAST-CFA ! 0 C, ( flags ) -ROT WARNING @ IF 2DUP GET-CURRENT SEARCH-WORDLIST IF DROP 2DUP TYPE ." isn't unique (" SOURCE-NAME TYPE ." )" CR THEN THEN CURRENT @ +SWORD ALIGN ( сдвигаем указатель кода так, чтобы при компиляции переменных и векторов ) ( следующая ячейка данных, находящаяся после CALL *-CODE была выровнена: ) ALIGN-BYTES @ DUP 4 > IF 5 - ALLOT ELSE 1 - ALLOT THEN HERE SWAP ! ( заполнили cfa ) ; ' SHEADER1 ' SHEADER TC-VECT! : HEADER ( "name" -- ) PARSE-NAME SHEADER ; … : CONSTANT ( x "<spaces>name" -- ) \ 94 \ Пропустить ведущие пробелы. Выделить name, ограниченное пробелом. \ Создать определение для name с семантикой выполнения, данной ниже. \ name используется как "константа". \ name Выполнение: ( -- x ) \ Положить x на стек. HEADER \ LIT, RET, ['] _CONSTANT-CODE COMPILE, , ;
Советская реализация[править]
Определение слова CONSTANT приводится у Баранова-Ноздрунова (стр. 40) и в 11-й главе Starting FORTH:
: CONSTANT ( N ---> ) <BUILDS , DOES> @ ;
Описание и определение слова CONSTANT в ядре ФОРТ-ЕС:
CONSTANT W-> ОПРЕДЕЛИТЬ СЛЕДУЮЩЕЕ СЛОВО 32 КАК КОНСТАНТУ СО ЗНАЧЕНИЕМ W Экран номер 32 ( 31.03.86 CONSTANT VARIABLE 2CONSTANT 2VARIABLE : ; ) : CONSTANT ( W->) CREATE , ;CODE RW1 0 (, 14 RFORTH LH, PUSHRW1 B, END-CODE
Определение слова CONSTANT в FORTH ИТЭФ:
HEAD 210Q,'CONSTAN',324Q,CON,$COL ; CONSTANT DW CREAT,SMUG,COMMA,PSCOD ; $CON LABEL FAR ADD BX, 2 PUSH [BX] NEXT
Ссылки[править]
- Исходный текст слова CONSTANT в Каллисто Классик 1.0
- См. также слова VARIABLE, FVARIABLE и VALUE
- Слово CONSTANT и комментарий к нему в стандарте ANS Forth (англ.)
- Слово CONSTANT и комментарий к нему в черновике Forth 200x (англ.)
- ПЕРЕМЕННЫЕ, КОНСТАНТЫ И МАССИВЫ в книге Л.Броуди «Начальный курс программирования на языке Форт»
- РАСШИРЕНИЕ КОМПИЛЯТОРА: ОПРЕДЕЛЯЮЩИЕ И КОМПИЛИРУЮЩИЕ СЛОВА в книге Л.Броуди «Начальный курс программирования на языке Форт»
- Variables, Constants, and Arrays в книге Leo Brodie Starting Forth (англ.)
- Extending the Compiler в книге Leo Brodie Starting Forth (англ.)
Это заготовка статьи. Вы можете помочь проекту, дополнив её. |