Язык Форт и его реализации


         

Литеры и строки, форматный вывод чисел - часть 5


Полный перевод числа выполняет слово #S:

: #S ( DD ---> 0,0 ) BEGIN # 2DUP D0= UNTIL ;

которое выделяет цифры числа последовательным делением, пока не получится нуль. Наконец, слово #> завершает форматное преобразование, возвращая адрес и длину получившейся текстовой строки:

: #> ( DD ---> A,N ) 2DROP HLD @ PAD OVER - ;

Для вывода знака «минус» имеется слово SIGN (знак):

: SIGN ( A ---> ) 0< IF C" - HOLD THEN ;

которое добавляет в буфер PAD знак «минус», если параметр на вершине стека (число одинарной точности) отрицателен.

С помощью перечисленных средств легко определить стандартные слова D. и . для печати чисел в свободном (минимальном) формате:

: D. ( DD ---> ) 2DUP DABS ( DD,DDABS ) <# #S ( DD,0,0 ) ROT ( D-МЛ,0,0,D-СТ ) SIGN ( D-МЛ,0,0 ) #> ( D-ML,A,N ) TYPE SPACE DROP ; : . ( N ---> ) S>D D. ;

Слово D. сначала переводит абсолютное значение исходного числа в строку литер, потом добавляет к ней возможный знак «минус», анализируя для этого старшую половину первоначального значения, и затем печатает получившуюся строку, выводя после нее еще один пробел. Слово . дополняет свой параметр до значения двойной длины распространением знакового разряда и обращается к слову D. для печати получившегося числа. Аналогичным образом реализуются стандартные слова D.R и .R , которые печатают число в поле заданного размера вплотную к его правому краю (отсюда в их мнемонике присутствует буква R от RIGHT — правый), добавляя при необходимости начальные пробелы:

: D.R ( DD:ЧИСЛО,F:РАЗМЕР ПОЛЯ ---> ) OVER 2SWAP DABS ( D-СТ,F,DD,DABS ) <# #S ROT SIGN #> ( F,A,N ) ROT OVER - ( A,N,F-A ) DUP 0> IF SPACES ELSE DROP THEN TYPE ; : .R (N:ЧИСЛО,F:РАЗМЕР ПОЛЯ ---> ) SWAP S>D D.R ;

В заключение рассмотрим программу шестнадцатиричиой распечатки областей памяти словом DUMP (дамп), которое получает на стеке адрес области и ее длину:

: DUMP ( A:АДРЕС,N:ДЛИНА ---> ) OVER BASE @ HEX 2SWAP ( A,B,A,N ) + ROT -2 AND ( B,A+N,A ) DO I <# C" * HOLD ( B,AI ) 0 15 DO DUP I + ( B,AI,AI+J ) C@ DECODE HOLD -1 +LOOP ( B,AI ) C" * HOLD ( B,AI ) 0 14 DO BL HOLD DUP ( B,AI,AI+J ) @ 0 # # 2DROP -2 +LOOP ( B,AI ) BL HOLD BL HOLD 0 # # # # #> ( B,AT,NT ) CR TYPE 16 +LOOP BASE ! ;




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