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



         

Глава 6. Фрагментация - часть 18


Чтобы что-нибудь выровнять, нам надо вычесть его ширину из 80 и поделить пополам, получая при этом левый отступ. Для расчета общей ширины мы складываем:

8 + 4 + 8 + 4 + 8 = 32

(три ширины и два переулка). (80 - 32) / 2 = 24.

Так мы можем определить

24 CONSTANT ЛЕВЫЙ-ОТСТУП

и проделать то же для верхнего-отступа.

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

В среде Форта мы имеем возможность использовать всю силу языка даже при компиляции. Почему бы не позволить Форту самому проделать расчеты?

ШИРИНА 3 * ПЕРЕУЛОК 2 * + 80 SWAP - 2/ CONSTANT ЛЕВЫЙ-ОТСТУП ШИРИНА 3 * УЛИЦА 2 * + 24 SWAP - 2/ CONSTANT ПРАВЫЙ-ОТСТУП

------------------------------------------------------------ СОВЕТ Если значение константы зависит от величины ранее введенной константы, используйте Форт для расчета этого значения. ------------------------------------------------------------

Все эти вычисления не производятся при работе задачи, так что они не влияют на скорость исполнения.

Вот еще один пример. Рисунок 6-2 содержит код для определения слова, рисующего картинки. Слово РИСОВАТЬ ставит звездочку на каждой координате, указанной в таблице по имени ТОЧКИ. (Здесь слово XY позицирует курсор в позицию ( x y ), снимаемую со стека.)

Рис.6-2. Еще один пример снижения избыточности при компиляции.

: P ( x y -- ) C, C, ; CREATE ТОЧКИ 10 10 P 10 11 P 10 12 P 10 13 P 10 14 P 11 10 P 12 10 P 13 10 P 14 10 P 11 12 P 12 12 P 13 12 P 14 12 P HERE ТОЧКИ - ( /таблицу) 2/ CONSTANT #ТОЧЕК : @ТОЧКА ( i -- x y) 2* ТОЧКИ + DUP 1+ C@ SWAP C@ ; : РИСОВАТЬ #ТОЧЕК 0 DO I @ТОЧКА XY ASCII * EMIT LOOP ;

Обратите внимание на строку, следующую сразу за списком точек:

HERE ТОЧКИ - ( /таблицу) 2/ CONSTANT #ТОЧЕК - 196 -

Фраза "HERE ТОЧКИ -" вычисляет количество байтов, занимаемых таблицей. Деля это значение на два, получаем число координат x-y в списке; это число становится константой #ТОЧЕК, используемой в качестве предела в цикле DO LOOP слова РИСОВАТЬ.


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