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




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


Используя IF THEN, мы могли бы написать:

: ОГРАНИЧЕНИЕ-СКОРОСТИ ( -- ограничение-скорости ) 'ШОССЕ? @ IF 55 ELSE 25 THEN ;

Мы можем устранить IF THEN, используя гибридное значение вместе с AND:

: ОГРАНИЧЕНИЕ-СКОРОСТИ 25 'ШОССЕ? @ 30 AND + ;

Но такой метод не отвечает нашей концептуальной модели задачи и по этой причине не очень удобочитаем. Давайте попробуем таблицу данных. Она имеет одно измерение и только два элемента, так что она не очень большая:

CREATE ПРЕДЕЛЫ 25 , 55 ,

Слово ОГРАНИЧЕНИЕ-СКОРОСТИ? должно теперь использовать булевское значение для подсчета смещения в таблице данных:

: ОГРАНИЧЕНИЕ-СКОРОСТИ ( -- ограничение-скорости ) ПРЕДЕЛЫ 'ШОССЕ? @ 2 AND + @ ;

Достигли ли мы чего-нибудь по сравнению с использованием IF THEN? Видимо, для такой простой задачи, нет. Что мы все-таки сделали, так это отделили процесс принятия решения от самих данных. Это лучше окупается, если мы имеем более, чем один набор данных для одного решения. Предположим, мы имели бы еще

CREATE #ПОЛОС 4 , 10 ,

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

: #ПОЛОС? ( -- #полос) #ПОЛОС 'ШОССЕ? @ 2 AND + @ ; - 257 -

Применяя технику факторизации, мы упрощаем это до:

: У-ДОРОГИ ( для-шоссе для-города ) CREATE , , DOES> ( -- данные) 'ШОССЕ? @ 2 AND + @ ;

55 25 У-ДОРОГИ ОГРАНИЧЕНИЕ-СКОРОСТИ? 10 4 У-ДОРОГИ #ПОЛОС?

ТАБЛИЦА ДАННЫХ С ДВУМЯ ИЗМЕРЕНИЯМИ.

Во второй главе мы представили задачу вычисления платы за телефон. На рис. 8-4 показано решение задачи с использованием двухмерной таблицы данных.

Рис.8-4. Решение задачи о плате за телефон.

\ Телефонные тарифы 03/30/84 CREATE ПОЛНЫЙ 30 , 20 , 12 , CREATE СРЕДНИЙ 22 , 15 , 10 , CREATE НИЗКИЙ 12 , 9 , 6 , VARIABLE ТАРИФ \ показывает на ПОЛНЫЙ, СРЕДНИЙ или НИЗКИЙ \ в зависимости от времени суток ПОЛНЫЙ ТАРИФ ! \ к примеру : ПЛАТА ( о -- ) CREATE , DOES> ( -- плата ) @ ТАРИФ @ + @ ; 0 ПЛАТА 1МИНУТА \ плата за первую минуту 2 ПЛАТА +МИНУТА \ плата за каждую дополнительную минуту 4 ПЛАТА /МИЛИ \ плата за каждые 100 миль




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