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




Глава 8. Минимизация структур управления - часть 30


Флаг позволяет сделать простой реализацию дополнительных операций, зависящих от состояния. В случае слова TYPE, тем не менее, нам нужна скорость работы. Мы так часто печатаем строки, что не можем при этом зря тратить время. Лучшим решением здесь может быть и установка функции TYPE, и загрузка флага:

DOER TYPE ( a # -- ) : ВИДЕО 0 УСТРОЙСТВО ! MAKE TYPE ( ... код для дисплея ... ) ; : ПРИНТЕР 1 УСТРОЙСТВО ! MAKE TYPE ( ... код для принтера ... ) ;

TYPE уже знает, какой код исполнять, остальные же определения будут использовать флаг. Другая возможность - это написание слова, которое выбирает значение вектора слова TYPE типа DOER (указатель на текущий код) и сравнивает его с адресом слова ПРИНТЕР. Если оно меньше этого адреса, то мы используем программу для ВИДЕО, иначе - обращаемся к ПРИНТЕРу. Если изменение состояния приводит к изменению небольшого количества функций, то все равно можно использовать DOER/MAKE. Вот определения трех операторов работы с памятью, которые можно выключать одновременно.

DOER !' ( векторное ! ) DOER CMOVE' ( векторное CMOVE) DOER FILL' ( векторное FILL ) : ЗАПИСЬ MAKE !' ! ;AND MAKE CMOVE' CMOVE ;AND MAKE FILL' FILL ;AND : -ЗАПИСЬ MAKE !' 2DROP ;AND MAKE CMOVE' 2DROP DROP ;AND MAKE FILL' 2DROP DROP ;AND

Однако, если количество необходимых к векторизации функций велико, предпочтительнее таблица состояний. Венчает это правило "запасной структурированный выход", слово типа DOER, которое векторизуется для осуществления структурированного выхода.

DOER КОЛЕБАТЬСЯ ( запасной выход ) : РАЗРЫВ КОЛЕБАТЬСЯ РАЗВОДИТЬСЯ ;

( ... Гораздо позже в тексте: ) : СМЯГЧИТЬСЯ MAKE КОЛЕБАТЬСЯ ДАРИТЬ-ЦВЕТЫ R> DROP ; - 273 -

По умолчанию КОЛЕБАТЬСЯ ни к чему не приводит. Если мы вызываем РАЗРЫВ, то дело кончается судом. Однако если СМЯГЧИТЬСЯ перед РАЗРЫВом, то мы пошлем букет цветов, а затем перепрыгнем сразу к точке с запятой, минуя суд так, что наш партнер(ша) о его возможности и не догадается. Такой подход особенно подходит там, где завершение должно производиться с помощью функции, определенной гораздо позже в программе (при декомпозиции по возрастанию сложности).


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