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


         

Одно измерение представляет десятичное место:


Одно измерение представляет десятичное место: единицы, десятки, сотни и т.д. Его устанавливают "текущим", и оно сохраняет свое состояние до тех пор, пока мы его не изменим.
Другое измерение выбирает желаемый тип символа - ЕДИНИЧКУ, ПЯТЕРКУ или ДЕСЯТКУ - внутри текущей десятичной позиции. Это измерение - случайное, то есть мы каждый раз указываем, какой из символов хотим получить.
Давайте начнем с создания "текущего" измерения. Нам нужен способ для указания текущей десятичной точки отсчета. Создадим переменную по имени #ПОЗИЦИИ (произносится "номер-позиции") и пусть в ней хранится смещение в таблице:
VARIABLE #ПОЗИЦИИ : ЕДИНИЦЫ 0 #ПОЗИЦИИ ! ; : ДЕСЯТКИ 2 #ПОЗИЦИИ ! ; : СОТНИ 4 #ПОЗИЦИИ ! ; : ТЫСЯЧИ 6 #ПОЗИЦИИ ! ;
Теперь можно изыскать путь для задания положения "стрелки" - добавляя содержимое #ПОЗИЦИИ к начальному адресу таблицы, оставляемому словом РИМСКИЕ:
: ПОЗИЦИЯ ( -- адр-позиции ) РИМСКИЕ #ПОЗИЦИИ @ + ;
Посмотрим, нельзя ли реализовать одно из слов для печати символа. Начнем с ЕДИНИЧКИ.
Мы хотим, чтобы оно выдавало (через EMIT) символ.
: ЕДИНИЧКА EMIT ;
Работая назад, обнаруживаем, что слово EMIT требует наличия на стеке кода ASCII символа. Откуда он там возьмется? С помощью слова C@.
: ЕДИНИЧКА C@ EMIT ;
Слово же C@ требует `адрес` ячейки, которая содержит нужный символ. Как мы его получим?
ЕДИНИЧКА - это первая "стрелка" перемещаемого указателя - позиция, на которую сразу и показывает слово ПОЗИЦИЯ. Поэтому нужный нам адрес получается просто:
: ЕДИНИЧКА ПОЗИЦИЯ C@ EMIT ;
Теперь давайте напишем слово ПЯТЕРКА. Оно вычисляет тот же адрес ячейки, но потом добавляет к нему единицу для перемещения к следующей ячейки перед получением символа:
: ЕДИНИЧКА ПОЗИЦИЯ 1+ C@ EMIT ;
А ДЕСЯТКА получается так:
: ЕДИНИЧКА ПОЗИЦИЯ 2+ C@ EMIT ;
Три эти определения избыточны. Поскольку единственным различием между ними является смещение, то можно выделить смещение из остальных определений:
: .СИМВОЛ ( смещение) ПОЗИЦИЯ + C@ EMIT ;

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