Язык Форт и его реализации


         

Векторное поле кода - часть 2


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

Введем слово QUAN (от QUANTITY — величина), которое определяет новое слово с тремя описанными выше действиями. В словарной статье таких слов вместо одного поля кода создается три — по одному на каждое действие. Будем обозначать их адреса через 0CFA, 1CFA и 2CFA соответственно (рис. 3.1). За ними располагается ячейка, отведенная под текущее значение данной переменной, обозначим ее адрес через 0PFA. Если рассматривать такую структуру как обычную словарную статью, то поле 0CFA является полем кода, а поля 1CFA, 2CFA и 0PFA занимают поле параметров. Если в шитый код скомпилирован адрес 0CFA, то при исполнении соответствующего кода в качестве адреса поля параметров выступает адрес 1CFA. Аналогично для адреса 1CFA полем параметров служит 2CFA, а для 2CFA — адрес 0PFA. Поэтому описанные выше три действия можно задать так:

: ЗНАЧ DOES> ( 1CFA -> N:ЗНАЧ) 4 + @ ; : ПРИСВ DOES> ( N:ЗНАЧ,2CFA ->) 2+ ! ; : АДР DOES> ( 0PFA -> 0PFA ) ;

Рис. 3.1. Структура статьи с векторным полем кода

Нетрудно увидеть, что действие АДР совпадает со стандартным действием для переменной, состоящим в том, что адрес поля параметров кладется на стек. Определим теперь слово QUAN, используя слово ПРИСВ в качестве вспомогательного:

: QUAN ( -> ) CREATE LATEST NAME> DUP @ ( КОД 2CFA) ПРИСВ SWAP @ ( КОД 2CFA,КОД 1CFA) , , 0 , DOES> ( КОД ДЛЯ 0CFA) 4 + @ ;

Создающая часть этого определения использует поле кода создаваемой статьи как рабочую ячейку, из которой сначала извлекается значение для 2CFA, засланное туда словом CREATE, и затем значение для 1CFA, которое засылается туда словом ПРИСВ. Окончательное значение в этой ячейке устанавливается словом DOES>. Описание переменной через слово QUAN выглядит так же, как описание обычной переменной: QUAN X.


Содержание  Назад  Вперед