VALUE

Материал из ПМК вики
Перейти к навигации Перейти к поиску

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

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

Определить следующее слово, как десятичную величину, которая хранит десятичное число.

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

В режиме ЛАТ последовательно нажмите клавиши     ШГ←      3   ИП 

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

 6.2.2405   VALUE                                                       CORE EXT
            ( x "<spaces>name" -- )
            Пропускает ведущие разделители пробелы. Выделяет name, ограниченное 
            пробелом. Создает определение для name с семантикой выполнения, 
            определенной ниже, с начальным значением равным x.

            name определено как "value".

        name Выполнение: ( -- x )
            Помещает x на стек. Значение x - то что задано, при создании name, 
            до тех пор пока не выполнена фраза  x TO name, задающая новое 
            значение x, связанное с name.

        См.: 3.4.1 Синтаксический анализ.

 A.6.2.2405   VALUE
 Типичное использование:

        0 VALUE DATA

        : EXCHANGE ( n1 -- n2 ) DATA SWAP TO DATA ;

 EXCHANGE оставляет n1 в DATA и возвращает предшествующее значение n2.

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

Слово VALUE резервирует десятичный регистр и присваивает ему имя, по которому из Каллисто будет производиться обращение к этому регистру, а также начальное значение.

Для записи в отведённый десятичный регистр в Каллисто используется слово TO.

Создающая часть слова VALUE является высокоуровневой. Для ускорения исполнения величин обе исполняющие части слова VALUE написаны на языке МК.

2546 ;#VALUE
2547 ; VALUE            ( x −− )                             Определить следующее слово, как десятичную величину с начальным значением x.
2548 ; Для хранения величин VALUE используются десятичные регистры.
2549 ; Данные хранятся в ячейке между двумя CFA, чтобы разработчик мог определять собственные
2550 ; порождающие слова с двумя обработчиками высокого уровня, использущие стандартное TO
2551 LVALUE:         .DB     5
2552                 .TEXT   "VALUE"                 ; ( x "<пр>имя" −− )
2553                 .DW     LFVAR
2554 VALUE:          .DW CALL, CREAT, DHERE, LITP
2555                 .DB 39,16                       ; 10000
2556                 .DW SUB, COMMA, DCOMMA, LITP,TOVALUE,COMMA, PSCOD
2557 ; Исполняющая часть VALUE (обычное вхождение величины)
2558                 RM7 1 + M5                      ; ( −− x ) из десятичного регистра
2559                 KRM5 RME ∗ KRM5 + M7            ; Получить номер регистра
2560                 KRM7 KM3  KGOTO9                ; Положить значение на стек, NEXT
2561 TOVALUE:        RM7 3 − M5                      ; ( x −− ) в десятичный регистр
2562                 KRM5 RME ∗ KRM5 + M7            ; Получить номер регистра
2563                 RM3 MA  1 + M3                  ; RA := адрес значения
2564                 KRMA KM7  KGOTO9                ; Записать значение в десятичный регистр, NEXT

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

CODE _TOVALUE-CODE
     POP EBX
     LEA EBX, -9 [EBX]
     MOV [EBX], EAX
     MOV EAX, [EBP]
     LEA EBP, 4 [EBP]
     RET             
END-CODE

' _TOVALUE-CODE TO TOVALUE-CODE
…
     ' _TOVALUE-CODE  >VIRT VALUE TOVALUE-CODE
…
: VALUE ( x "<spaces>name" -- ) \ 94 CORE EXT
  [T] HEADER [I]
  CONSTANT-CODE COMPILE, ,
  TOVALUE-CODE COMPILE,
;
: VALUE ( x "<spaces>name" -- ) \ 94 CORE EXT
\ Пропустить ведущие пробелы. Выделить name, ограниченное пробелом. Создать 
\ определение для name с семантикой выполнения, определенной ниже, с начальным 
\ значением равным x.
\ name используется как "значение".
\ Выполнение: ( -- x )
\ Положить x на стек. Значение x - то, которое было дано, когда имя создавалось,
\ пока не исполнится фраза x TO name, задав новое значение x, 
\ ассоциированное с name.
  HEADER
  ['] _CONSTANT-CODE COMPILE, ,
  ['] _TOVALUE-CODE COMPILE,
;

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


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