Слово ,

Материал из ПМК вики
Версия от 15:06, 30 июня 2021; AtH (обсуждение | вклад) (→‎Реализация)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигации Перейти к поиску

, (компилировать, читается «запятая») — стандартное слово Каллисто.

,              ( d −− )                             Скомпилировать d в первую свободную ячейку словаря.
Пример работы слова ,

Компилирует вершину стека, как 16-битное число в первую свободную ячейку словаря.

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

В режиме NUM нажмите белую клавишу   ,  

, в стандарте ANS Forth[править]

 6.1.0150   ,                                  "comma"                      CORE
            ( x -- )
            Резервирует одну ячейку области данных, и сохраняет x в ячейке. 
            Если указатель области данных выровнен перед выполнением ",", то он 
            останется выровненным после окончания выполнения ",". 
            Неопределенная ситуация существует если указатель области данных не 
            выровнен перед выполнением ",".

        См.: 3.3.3 Область данных, 3.3.3.1 Выравнивание адреса.

 A.6.1.0150   ,
 Использование , (запятая) для компиляции идентификаторов исполнения - не 
 переносимое.

 См.: 6.2.0945 COMPILE,.

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

, в предыдущем стандарте Forth-83 (англ.)[править]

     ,            16b --                        79             "comma"
          ALLOT space for 16b then store 16b at HERE 2- .

, в стандарте Forth-79 (англ.)[править]

,              n --                          143            "comma"
    Allot two bytes in the dictionary, storing n there.

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

,             n  ---           ,                L0
       Store n into the next available dictionary memory cell, advancing
       the dictionary pointer. (comma)

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

2936 ;               ∗∗ Слова высокого уровня ∗∗
2937 
2938 ;#Comma
2939 ; ,                ( d −− )                             Скомпилировать d в первую свободную ячейку словаря.
2940 LCOMMA:         .DB     1
2941                 .TEXT   ","                             ; ( n −− )
2942                 .DW     LSAVIN
2943 COMMA:          .DW CALL
2944 RCOMMA:         .DW HERE,STORE, TWO,ALLOT, EXIT

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

: , ( x -- ) \ 94
\ Зарезервировать одну ячейку в области данных и поместить x в эту ячейку.
  DP @ 4 ALLOT !
;
0 CONSTANT INLINE? 
…
: INLINE, 
 BEGIN COUNT DUP C3 <> 
 WHILE C, 
 REPEAT 2DROP ; 
…
: _COMPILE,  \ 94 CORE EXT
\ Интерпретация: семантика не определена.
\ Выполнение: ( xt -- )
\ Добавить семантику выполнения определения, представленого xt, к
\ семантике выполнения текущего определения.
  ?SET
  SetOP
  0E8 C,              \ машинная команда CALL
  DP @ CELL+ - ,
  DP @ TO LAST-HERE
;

: COMPILE,  \ 94 CORE EXT
\ Интерпретация: семантика не определена.
\ Выполнение: ( xt -- )
\ Добавить семантику выполнения определения, представленого xt, к
\ семантике выполнения текущего определения.
    CON>LIT 
    IF  INLINE?
      IF     INLINE,
      ELSE   _COMPILE,
      THEN
    THEN
;

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

У Баранова-Ноздрунова (стр. 23), а также в 9 главе Starting FORTH приводится следующее описание слова , :

 : ,   ( A ---> )    HERE ! 2 ALLOT ;

Описание и определение слова , в ядре ФОРТ-ЕС:

,         W-> СКОМПИЛИРОВАТЬ W НА ВЕРШИНУ СЛОВАРЯ               11

                     Экран номер 11
( 31.03.86      !  0!  @  С!  С@  , С, EXECUTE )

: ,  ( W-> )  HERE 2 ALLOT ! ;

Определение слова , в FORTH ИТЭФ:

            HEAD     201Q,,254Q,COMMA,$COL                ; ,
            DW HERE,STORE,TWO,ALLOT,SEMI

Переносимые программы, написанные на Форте ANS, используют слово CELL вместо 2 для совместимости с машинами, в которых ячейка занимает больше двух байт.

colorForth (cf2019.nasm 2019 Sep 14)[править]

comma_:          ; 4 byte  ,
    mov ecx, 0x04
dcomma:     ; c,  performed n times ( n in ecx )
    mov edx, [ v_H ]
    mov [edx], _TOS_
    mov _TOS_, [ esi ]
    lea edx, [ ecx + edx ]
    lea esi, [ esi + 0x04 ]
    mov [ v_H ], edx
    ret

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


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