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



         

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


Почему бы нам было не написать

: СВЕТЛО TRUE 'СВЕТ? ! ;

для установки флага, и

'СВЕТ @ IF 8 OR THEN ... - 271 -

для его использования? Этот подход не столь прост, как элементарная запись в переменную битовой маски для интенсивности:

: СВЕТЛО 8 'СВЕТ? ! ;

и затем ее использование в виде

'СВЕТЛО @ OR ...

------------------------------------------------------------ СОВЕТ Не устанавливайте флаг, устанавливайте функцию. (Векторизуйте.) ------------------------------------------------------------

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

VARIABLE УСТРОЙСТВО ( 0=видео | 1=принтер ) : ВИДЕО FALSE УСТРОЙСТВО ! ; : ПРИНТЕР TRUE УСТРОЙСТВО ! ; : TYPE ( a # -- ) УСТРОЙСТВО @ IF ( ... код для принтера ... ) ELSE ( ... код для дисплея .... ) THEN ;

Это плохо потому, что Вы принимаете рещение каждый раз, когда печатаете строку. Предпочтительное решение должно использовать векторизованное исполнение, например:

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

Это лучше, поскольку слову TYPE не надо каждый раз решать, какой из кодов использовать, оно это уже знает. (В многозадачной системе задачи для принтера и для монитора будут иметь каждая свою собственную копию исполнительного вектора для TYPE, хранимую в пользовательской переменной.) Вышеприведенный пример показывает также и ограничения для этого совета. В нашей второй версии у нас не осталось простого - 272 -

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


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