Способ мышления-Форт

       

Упрятывание конструкции структур данных


Мы уже отмечали две особенности Форта, обеспечивающие использование описанной методологии -- автоматические вызовы и автоматическую передачу данных. Третья особенность позволяет описывать структуры данных внутри компонента в терминах предварительно описанных компонентов. Эта особенность -- прямой доступ к памяти.

Предположим, что мы определяем переменную ЯБЛОКИ:

VARIABLE ЯБЛОКИ

Мы можем записать число в эту переменную для указания того, сколько яблок имеется в текущий момент:

20 ЯБЛОКИ !

Мы можем распечатать содержимое переменной:

ЯБЛОКИ ? 20 ok ~~~~~~~

Мы можем увеличить ее содержимое на единицу:

1 ЯБЛОКИ +!

(Новичок может изучить механизм работы этих фраз по .)

Слово ЯБЛОКИ имеет единственную функцию: положить на стек `адрес` в памяти, где хранится количество яблок. О количестве можно думать как о "вещи", в то время как о словах, устанавливающих количество, считывающих или увеличивающих его -- как о "действиях".

Форт удобно отделяет "вещи" от "действий", поскольку разрешает передачу адресов через стек и имеет команды "разыменования" и "загрузки".

Мы обсуждали важность проектирования по признаку того, что может измениться. Предположим, мы написали множество кода, использующего переменную ЯБЛОКИ. И теперь, в одиннадцатом часу, обнаруживаем, что необходимо отслеживать два различных типа яблок -- красных и зеленых!



Не стоит опускать руки, лучше вспомнить функцию слова ЯБЛОКИ: давать адрес. Если нам нужно два различных количества, ЯБЛОКИ могут давать два различных адреса, в зависимости от того, о каком типе яблок мы говорим. Так мы можем определить более сложную версию слова ЯБЛОКИ, как показано ниже:

VARIABLE ЦВЕТ ( указатель на текущую переменную) VARIABLE КРАСНЫЕ ( количество красных яблок) VARIABLE ЗЕЛЕНЫЕ ( количество зеленых яблок) : КРАСНЫЙ ( тип яблок - красные) КРАСНЫЕ ЦВЕТ ! ; : ЗЕЛЕНЫЙ ( тип яблок - зеленые) ЗЕЛЕНЫЕ ЦВЕТ ! ; : ЯБЛОКИ ( -- адр текущей яблочной переменной) ЦВЕТ @ ;


Рис.1-10. Смена косвенного указателя.

+------+ | ЦВЕТ | +------+ КРАСНЫЙ | ~~~~~~~ +---------+ | +---------+ | КРАСНЫЕ |

+------+ | ЦВЕТ | +------+ ЗЕЛЕНЫЙ | ~~~~~~~ +---------+ | +---------+ | КРАСНЫЕ | ------>| ЗЕЛЕНЫЕ | +---------+ +---------+

Мы переопределили ЯБЛОКИ. Теперь они дают содержимое переменной по имени ЦВЕТ. ЦВЕТ -- указатель: либо на переменную КРАСНЫЕ, либо на переменную ЗЕЛЕНЫЕ. Последние две переменных и являются действительными хранилищами для количеств.

Если мы сначала говорим КРАСНЫЙ, то можно использовать ЯБЛОКИ по отношению к красным яблокам, если говорим ЗЕЛЕНЫЙ, то -- по отношению к зеленым (рис. 1-10).

Нам не понадобилось изменять синтаксис чего-либо в наработанном коде, использующем ЯБЛОКИ. Мы так же говорим

20 ЯБЛОКИ !

и

1 ЯБЛОКИ +!

Взгляните опять на то, что мы сделали. Мы изменили описание слова ЯБЛОКИ с описания переменной на определение через двоеточие, никак не повлияв на метод его использования. Форт позволяет нам скрыть детали того, как определено слово ЯБЛОКИ, от использующего его кода. То, что представляется "вещью" с точки зрения старых определений, в действительности является "действием" (определением через двоеточие) внутри компонента.

Форт вдохновляет на использование абстрактных типов данных, позволяя определять структуры данных в терминах компонентов нижнего уровня. Только Форт, исключающий вызовы (вида CALL) в процедурах, позволяющий передавать адреса и данные через стек и предоставляющий прямой доступ к памяти с помощью слов @ и ! может предложить такой уровень упрятывания информации.

Форт мало заботится о том, является ли что-либо структурой данных или алгоритмом. Это дает нам, программистам, невероятную свободу в создании тех частей речи, которые нам нужны для описания наших задач.

Я стараюсь думать о каждом слове, возвращающем адрес (например, ЯБЛОКИ) как о "существительном" независимо от способа, которым оно определено. Слово, производящее очевидное действие -- это "глагол".

Такие слова, как КРАСНЫЙ и ЗЕЛЕНЫЙ в нашем примере, могут быть названы только "прилагательными", поскольку они изменяют функцию слова ЯБЛОКИ. Фраза

КРАСНЫЙ ЯБЛОКИ ?

отличается от фразы

ЗЕЛЕНЫЙ ЯБЛОКИ ?

Слова Форта могут служить также наречиями и предлогами. Мало смысла в том, чтобы определить, какой частью речи является конкретное слово, поскольку Форту в любом случае все равно. Нам нужно лишь порадоваться легкости описания задачи в естественных выражениях.




Содержание раздела