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


Глава 4. Детализированная разработка/решение задачи - часть 28


Можно упростить определение до:

: ПОЧТИ ( частное ) ЕДИНИЧКА IF ДЕСЯТКА ELSE ПЯТЕРКА THEN ;

Мы считаем, что на стеке у нас имеется частное. Давайте вернемся к определению ЦИФРА и подумаем о том, что там происходит:

: ЦИФРА ( n) 5 /MOD OVER 4 = IF ПОЧТИ ELSE IF ПЯТЕРКА THEN ЕДИНИЧКИ THEN ;

Выходит, что у нас имеется не только частное, но под ним и остаток. Мы их оба храним на стеке для случая перехода на часть ELSE. Слово ПОЧТИ, однако, употребляет только частное. Поэтому для сохранения симметрии мы обязаны написать для остатка DROP:

: ЦИФРА ( n) 5 /MOD OVER 4 = IF ПОЧТИ DROP ELSE IF ПЯТЕРКА THEN ЕДИНИЧКИ THEN ;

У нас получилось полное определение в коде для печати одной римской цифры. Если бы мы спешили срочно проверить его до написания необходимых внешних определений, то могли бы легко набросать лексикон слов, нужных для печати группы символов, скажем, ЕДИНИЧЕК:

: ЕДИНИЧКА ." I" ; : ПЯТЕРКА ." V" ; : ДЕСЯТКА ." Х" ; : ЕДИНИЧКИ ( #-единичек) ?DUP IF 0 DO ЕДИНИЧКА LOOP THEN ;

до загрузки наших слов ПОЧТИ и ЦИФРА.

Но мы не столь нетерпеливы. Нет, мы озабочены тем, чтобы слова ЕДИНИЧКА, ПЯТЕРКА и ДЕСЯТКА давали символы, зависящие от положения цифры в числе.

Давайте вернемся к таблице символов, которую рисовали раньше:

ЕДИНИЧКИ ПЯТЕРКИ

единицы I V десятки X L сотни C D тысячи M

Мы встретились также с необходимостью иметь "ДЕСЯТКИ" - т.е. ЕДИНИЧКИ на один ряд ниже. Как если бы на самом деле написать таблицу в виде:

ЕДИНИЧКИ ПЯТЕРКИ ДЕСЯТКИ единицы I V Х десятки X L C сотни C D M тысячи M

Однако это кажется избыточным. Нельзя ли избежать этого? Может быть, попытаться нарисовать другую таблицу, например, линейную:

единицы I V десятки X L сотни C D тысячи M

Можно представить себе, что имя каждого заголовка ("единицы", "десятки" и др.) указывает на позицию соответствующей ЕДИНИЧКИ. Отсюда можно также получить ПЯТЕРКУ, опускаясь на одну строку ниже текущей ЕДИНИЧКИ, и ДЕСЯТКУ, опускаясь на две строки.




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



Книжный магазин