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




Глава 7. Работа с данными: стеки и состояния - часть 3


Предположим, мы пытаемся написать определение слова +THRU (см. главу 5, "Организация листингов", "Блоки загрузки глав"). Мы решили, что тело нашего цикла будет

... DO I LOAD LOOP ;

то есть мы поместим LOAD в цикл и будем давать ему индекс цикла, загружая блоки по их абсолютным номерам. Изначально на стеке мы имеем:

низ верх

где "низ" и "верх" - это `смещения` от BLK. Мы должны их представить для DO в следующем виде:

верх+1+blk низ+blk

Самой сложной нашей задачей является прибавление значения BLK к обоим смещениям. Мы уже ступили на неверную дорожку, но еще об этом не догадываемся. Так что давайте продолжать. Мы пытаемся: - 206 -

низ верх BLK @ низ верх blk SWAP низ blk верх OVER низ blk верх blk + низ blk верх+blk 1+ низ blk верх+blk+1 ROT ROT верх+blk+1 низ blk + верх+blk+1 низ+blk

Мы все проделали, но что же это за путаница! Если мы любим самобичевание, то должны проделать еще два таких усилия, приходя к

BLK @ DUP ROT + 1+ ROT ROT +

и к

BLK @ ROT OVER + ROT ROT + 1+ SWAP

Все три предложения делают одно и то же, но код, кажется, становится лишь все мрачнее, но не лучше. Опыт нам подсказывает, что комбинация ROT ROT - это опасный признак: на стеке - столпотворение. Нет необходимости в тщательной проработке вариантов для определения проблемы: как только мы создали две копии "blk", мы сразу получили четыре элемента на стеке. Первое, о чем обычно вспоминают в этом месте - это о стеке возвратов:

BLK @ DUP >R + 1+ SWAP R> +

(Смотрите далее "Шикарный стек возвратов".) Мы здесь продублировали "blk", сохраняя его копию на стеке возвратов и прибавляя другую копию к "верху". Признаем улучшение. А как читабельность? Дальше мы думаем: "Может быть, нам нужна именованная переменная." Конечно, у нас уже есть одна: BLK. Поэтому пробуем:

BLK @ + 1+ SWAP BLK @ + - 207 -

Теперь это читается лучше, но все еще слишком длинно, и к тому же избыточно. BLK @ + появляется здесь дважды. "BLK @ +"? Это звучит как-то знакомо.


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