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



         

Глава 7. Работа с данными: стеки и состояния - часть 22


В этой модели имена СВЕРХУ, СНИЗУ и т.д. могут быть выполнены так, что будут указывать на две таблицы, РЕАЛЬНЫЕ и ПСЕВДО. Делая текущей таблицу РЕАЛЬНЫЕ, мы устанавливаем все имена-указатели внутрь этой таблицы; делая текущей таблицу ПСЕВДО, получаем адреса внутри другой таблицы. Программа на рис. 7-6 реализует механизм альтернативных состояний. - 227 -

Рис.7-6. Реализация механизма альтернативных состояний.

VARIABLE 'УКАЗАТЕЛИ \ указатель на таблицу состояния : УКАЗАТЕЛИ ( -- адр текущей таблицы) 'УКАЗАТЕЛИ @ ; : ПОЗИЦИЯ ( смещ - смещ+2) CREATE DUP , 2+ DOES> ( -- a) @ УКАЗАТЕЛИ + ; 0 \ начальное смещение ПОЗИЦИЯ СВЕРХУ ПОЗИЦИЯ СНИЗУ ПОЗИЦИЯ СЛЕВА ПОЗИЦИЯ СПРАВА ПОЗИЦИЯ ВНУТРИ ПОЗИЦИЯ СНАРУЖИ CONSTANT /УКАЗАТЕЛИ \ конечное вычисленне смещение

CREATE РЕАЛЬНЫЕ /УКАЗАТЕЛИ ALLOT \ реальная таблица CREATE ПСЕВДО /УКАЗАТЕЛИ ALLOT \ временная таблица : РАБОТА РЕАЛЬНЫЕ 'УКАЗАТЕЛИ ! ; РАБОТА : ПРИТВОРСТВО ПСЕВДО 'УКАЗАТЕЛИ ! ;

Слова РАБОТА и ПРИТВОРСТВО соответственно меняют указатели. К примеру:

РАБОТА 10 СВЕРХУ ! СВЕРХУ ? 10 ~~~ ПРИТВОРСТВО 20 СВЕРХУ ! СВЕРХУ ? 20 ~~~ РАБОТА СВЕРХУ ? 10 ~~~ ПРИТВОРСТВО СВЕРХУ ? 20 ~~~ Главное отличие в этом последнем подходе заключается в том, что имена проходят через дополнительный уровень перенаправления (УКАЗАТЕЛИ переделаны из константы в определение через двоеточие). Имена полей можно заставить показывать на одну из двух таблиц состояний. Поэтому каждому из них приходится выполнять немного больше работы. Кроме того, при предыдущем подходе имена соответствовали фиксированным местам в памяти; требовалось применение CMOVE всякий раз, когда мы сохраняли или восстанавливали значения. - 228 -

При нынешнем подходе нам нужно лишь поменять единственный указатель для смены текущей таблицы.

ВЕКТОРИЗОВАННОЕ ИСПОЛНЕНИЕ ~~~~~~~~~~~~~~~~~~~~~~~~~~ Векторизованное исполнение применяет идеи потоков и перенаправления данных к функциям. Точно так же, как мы сохраняем значения и флаги из переменных, мы можем сохранять и функции, поскольку на последние также можно ссылаться по их адресу.


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