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


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


Давайте рассмотрим некоторые проблемы, которые это может породить и кое-что из того, что можно с ними сделать. BASE - это переменная, которая показывает текущую системы счисления для всего числового ввода и вывода. Следующие слова обычно присутствуют в Форт-системах:

: DECIMAL 10 BASE ! ; : HEX 16 BASE ! ;

Представьте себе, что мы пишем слово, печатающее "дамп" памяти. Обычно мы работаем в десятичном режиме, но хотим показать дамп в шестнадцатеричном. Мы пишем так:

: DUMP ( a # ) HEX ... ( код для дампа ) ... DECIMAL ;

Это работает - большую часть времени. Однако здесь заложена презумпция того, что мы хотим вернуться назад к десятичной системе. А что как если мы работали в шестнадцатеричной и хотим вернуться именно к ней? До изменения значения переменной BASE на HEX нам следует сохранить ее текущее значение. Когда дамп закончится, мы его восстановим. Это значит, что мы должны на время отложить старое значение, пока формируем дамп. Одно из возможных мест для этого - стек возвратов:

: DUMP ( a # ) BASE @ >R HEX ( код для дампа ) R> BASE ;

Если это покажется сложным, мы можем определить временную переменную:

VARIABLE СТАРЫЙ-BASE : DUMP ( a # ) BASE @ СТАРЫЙ-BASE ! HEX ( код для дампа ) СТАРЫЙ-BASE @ BASE ! ;

Как же быстро все усложняется. В этой ситуации если и текущее, и старое содержимое переменной принадлежит только Вашей задаче (и не является частью Вашей системы), и если такая ситуация возникает более, чем один раз, примените технику факторизации:

: СХОРОНИТЬ ( а) DUP 2+ 2 CMOVE> ; : ЭКСГУМИРОВАТЬ ( а) DUP 2+ SWAP 2 CMOVE ; - 219 -

Затем вместо определения двух переменных типа УСЛОВИЕ и СТАРОЕ-УСЛОВИЕ, определите одну переменную двойной длины:

2VARIABLE УСЛОВИЕ

Используйте СХОРОНИТЬ и ЭКСГУМИРОВАТЬ для сохранения и восстановления начального значения:

: ДЕЛИШКИ УСЛОВИЕ СХОРОНИТЬ 17 УСЛОВИЕ ! ( делишки) УСЛОВИЕ ЭКСГУМИРОВАТЬ ;

СХОРОНИТЬ держит "старую" версию условия по адресу УСЛОВИЕ 2+. Вам все равно следует быть осторожными.


Начало  Назад  Вперед