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



             

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


: ДВЕ-ТРЕТИ ( n1 -- n2 ) 2 3 /* ;

Когда данные должны применяться в `середине` полезного выражения, нам приходится использовать манипуляции со стеком. К примеру, для того, чтобы расположить по центру 80-знаковой строки экрана текст длиной в 10 символов, можно написать:

80 10 - 2/ SPACES

Однако текст не всегда бывает длиной по 10 символов. Для придания полезности такой фразе при любой строке, следовало бы отделить длину, написав:

: ЦЕНТРОВАТЬ ( длина -- ) 80 SWAP - 2/ SPACES ;

Стек данных может также использоваться и для передачи адресов. Поэтому то, что выделено, может быть `указателем` на данные, вместо самих данных. Данные же могут быть числами и даже строками, но все равно будут таким образом отделены благодаря использованию стека.

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

Сегмент 1: ВИЛЛИ НИЛЛИ ПУДИНГ ПИРОГ AND Сегмент 2: ВИЛЛИ НИЛЛИ 8 * ПУДИНГ ПИРОГ AND

Как можно факторизовать операцию "8 *"? Оставляя "*" во фрагменте, и передавая ему единицу или восьмерку:

: НОВАЯ ( n -- ) ВИЛЛИ НИЛЛИ * ПУДИНГ ПИРОГ AND ; Сегмент 1: 1 НОВАЯ Сегмент 2: 8 НОВАЯ

(Конечно, если ВИЛЛИ или НИЛЛИ меняют состояние стека, Вам понадобится добавить подходящие стековые операторы.)

Если операция производит сложение, то ее можно обойти, передавая фрагменту ноль.

------------------------------------------------------------ СОВЕТ Для простоты пытайтесь представить различия в похожих фрагментах как числовые (по значениям или адресам), вместо того, чтобы представлять их как процедурные. ------------------------------------------------------------

ВЫДЕЛЕНИЕ ФУНКЦИЙ.

С другой стороны, различие иногда представляется `только` функцией. Дано:

Сегмент 1: ВЗДОР-А ВЗДОР-Б ВЗДОР-В ВЗДОР-Г ВЗДОР-Д ВЗДОР-Е Сегмент 2: ВЗДОР-А ВЗДОР-Б ПЕРЕВОРОТ ВЗДОР-Г ВЗДОР-Д ВЗДОР-Е

Неправильный подход:

: ВЗДОРЫ ( t=делать-ВЗДОР-В | f=делать-ПЕРЕВОРОТ -- ) ВЗДОР-А ВЗДОР-Б IF ВЗДОР-В ELSE ПЕРЕВОРОТ THEN ВЗДОР-Г ВЗДОР-Д ВЗДОР-Е ;




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