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


         

Такая конструкция позволяет Вам добавлять


Такая конструкция позволяет Вам добавлять или убирать точки из таблицы, не заботясь о том, сколько их получается. Форт подсчитывает это Вам.
ФАКТОРИЗЦИЯ ПРИ КОМПИЛЯЦИИ С ПОМОЩЬЮ ОПРЕДЕЛЯЮЩИХ СЛОВ.
Давайте исследуем набор подходов к одной и той же проблеме - определению группы связанных адресов. Вот первая попытка:
HEX 01A0 CONSTANT БАЗОВЫЙ.АДРЕС.ПОРТА БАЗОВЫЙ.АДРЕС.ПОРТА CONSTANT ДИНАМИК БАЗОВЫЙ.АДРЕС.ПОРТА 2+ CONSTANT ПЛАВНИК-А БАЗОВЫЙ.АДРЕС.ПОРТА 4 + CONSTANT ПЛАВНИК-Б БАЗОВЫЙ.АДРЕС.ПОРТА 6 + CONSTANT ПОДСВЕТ DECIMAL
Замысел правильный, но реализация его уродлива. Единственные элементы, меняющиеся от порта к порту - это числовые смещения и определяемые имена; все остальное повторяется. Такой повтор подсказывает применение определяющего слова. Следующий, более читабельный вариант, выделяет весь повторяющийся код в часть "does" определяющего слова:
: ПОРТ ( смещение -- ) CREATE , DOES> ( -- 'порта ) @ БАЗОВЫЙ.АДРЕС.ПОРТА + ; 0 ПОРТ ДИНАМИК 2 ПОРТ ПЛАВНИК-А 4 ПОРТ ПЛАВНИК-Б 6 ПОРТ ПОДСВЕТ
При таком решении мы производим расчет смещения во время `исполнения` всякий раз, когда вызываем эти имена. Было бы более эффективно производить вычисления во время компиляции, например, так:
: ПОРТ ( смещение -- ) БАЗОВЫЙ.АДРЕС.ПОРТА + CONSTANT ; \ does> ( -- 'порта ) 0 ПОРТ ДИНАМИК 2 ПОРТ ПЛАВНИК-А 4 ПОРТ ПЛАВНИК-Б 6 ПОРТ ПОДСВЕТ - 197 -
Мы здесь ввели определяющее слово ПОРТ, которое имеет уникальное поведение во время `компиляции` - а именно добавляет смещение к БАЗОВЫЙ.АДРЕС.ПОРТА и определяет константу. Мы можем даже пройти еще один шаг вперед. Предположим, что адреса всех портов отстоят друг от друга на 2 байта. В этом случае нет такой причины, по которой мы обязаны были бы определять эти смещения. Числовая последовательность
0 2 4 6
сама по себе избыточна. В следующей версии мы начинаем с того, что имеем на стеке БАЗОВЫЙ.АДРЕС.ПОРТА. Определяющее слово ПОРТ дублирует адрес, делает из него константу, а затем добавляет 2 к остающемуся на стеке адресу для использования следующим вызовом слова ПОРТ.

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