CONSTANT

Материал из ПМК вики
Версия от 09:26, 19 февраля 2019; AtH (обсуждение | вклад) (→‎Реализации из SP-Forth 4.20)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигации Перейти к поиску

CONSTANT (константа) — стандартное порождающее слово Каллисто.

CONSTANT       ( D −− )                             Определить следующее слово, как константу со значением D.
Пример работы слова CONSTANT

Определить следующее слово, как 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

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


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