Начальный курс программирования на языке Форт


ПРЕОБРАЗОВАНИЕ ВВОДИМЫХ ЧИСЕЛ


Как было показано в гл. 7, с помощью слов <# и #> можно преобразовать число, находящееся в стеке, в строку символов в коде ASCII. Слово CONVERT (ПРЕОБРАЗОВАТЬ) выполняет обратную функцию: оно переводит строку символов ASCII, представляющих некоторое число, в двоичную форму и заносит его в стек.

 

CONVERT

( ud1 a1 -- ud2 а2)

Начиная с адреса a1+1 (байт, содержащий длину, пропускается), CONVERT преобразует строку в двоичное значение, которое зависит от текущей системы счисления (значения BASE). Полученное значение накапливается в ud1, и остается на стеке как ud2. Процесс продолжается до тех пор, пока не встретится символ, который не может выть истолкован как цифра в текучей системе счисления. Адрес этого символа заносится на стек как а2.

Приведем несложный пример:: ПЛЮС \ n2 ( n1 -- сумма ) 0 0 BL WORD CONVERT 2DROP + ;

Это определение можно использовать следующим образом: 12 ПЛЮС 23 . 35 ок

Слово ПЛЮС является лучшим доказательством (для скептиков) того, что в Форте можно применять инфиксную запись выражений. Это слово начинает выполняться при одном занесенном в стек в двоичной форме аргументе 12. В первую очередь, занося в стек нуль двойной длины, мы очищаем место для накопления, после чего слово WORD сканирует входной поток для чтения второго аргумента n2 и оставляет адрес прочитанного фрагмента в вершине стека. Слово CONVERT преобразует строку по заданному адресу (пропуская первый байт со счетчиком) в число двойной длины и заносит его в стек на место нуля. 2DROP удаляет из стека последний адрес, помещенный в него словом CONVERT вместе со старшей ячейкой преобразованного числа, превращая последнее тем самым в число одинарной длины. Наконец, + складывает два верхних числа в стеке.

Если бы слово CONVERT функционировало с такими аргументами: ( а -- ud)

то его можно было бы применять повторно, выполняя преобразования строки, содержащей различные нецифровые символы. Например, строку 6/20/85

можно преобразовать в три числа одинарной длины, трижды подряд обращаясь к CONVERT.


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