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


         

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


Наконец, если перед Вами возникает ситуация, когда надо сохранять/восстанавливать значение, убедитесь в том, что это не есть следствие плохой факторизации. Предположим, к примеру, что мы написали:
: ДЛИННАЯ 18 #ДЫР ! ; : КОРОТКАЯ 9 #ДЫР ! ; : ИГРА #ДЫР @ 0 DO I ДЫРА ИГРАТЬ LOOP ;
Текущая ИГРА может быть либо короткой, либо длинной. Позже мы решили, что нам нужно слово для игры с `любым` количеством дыр. Поэтому мы вызываем слово ИГРА так, чтобы не испортить текущий тип игры (число дыр):
: ДЫРЫ ( n) #ДЫР @ SWAP #ДЫР ! ИГРА #ДЫР ! ;
Поскольку нам понадобилось слово ДЫРЫ уже после того, как была определена ИГРА, то, кажется, оно и должно иметь большую сложность: мы строим ДЫРЫ вокруг игры. Но на самом деле - может быть, Вы это уже видите - правильнее будет переделать:
: ДЫРЫ ( n) 0 DO I ДЫРА ИГРАТЬ LOOP ; : ИГРА #ДЫР @ ДЫРЫ ;
Мы можем построить игру вокруг дыр и избежать всей этой белиберды с запоминанием/восстановлением.
ВНУТРЕННИЕ СТЕКИ ПРОГРАММ ~~~~~~~~~~~~~~~~~~~~~~~~~ В последнем разделе мы исследовали некоторые пути для сохранения и восстановления `единственного` предыдущего значения. Некоторые задачи требуют того же для `нескольких` значений. Часто для Вас может оказаться самым удобным определение своего собственного стека. Вот исходный текст для пользовательского стека, имеющий очень простой контроль ошибок (при ошибках стек очищается): - 221 -
CREATE СТЕК 12 ALLOT \ { 2указ-стека | 10стек [5 элем.] } HERE CONSTANT СТЕК>
: ИНИЦ-СТЕК СТЕК СТЕК ! ; ИНИЦ-СТЕК : ?СБОЙ ( ?) IF ." Ошибка стека" ИНИЦ-СТЕК ABORT THEN ; : PUSH ( n) 2 СТЕК +! СТЕК @ DUP СТЕК> = ?СБОЙ ; : POP ( -- n) СТЕК @ @ -2 СТЕК +! СТЕК @ СТЕК < ?СБОЙ ;
Слово PUSH берет число со стека данных и "заталкивает" его на этот новый стек. POP работает обратным образом, число "всплывает" из нового стека и ложится на Фортов стек данных. В реальной задаче Вам может захотеться применить другие имена для PUSH и POP с тем, чтобы они лучше соответствовали своему концептуальному назначению.

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