Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пн дек 11, 2017 08:06

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: Форматированный вывод
СообщениеДобавлено: Пт мар 27, 2009 00:03 
Не в сети
Аватара пользователя

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1252
Благодарил (а): 3 раз.
Поблагодарили: 16 раз.
Печать строк: возврат каретки, новая строка, изменение цвета символов и фона(цвет указывается шестнадцатиричным числом в текстовом виде в самой строке), плюс можно и дальше достаточно легко расширять. И почти "стандартное" форматное преобразование чисел - преобразуется одно 32-битное число. Преобразование двойного числа легко делается так:
Код:
123 456 <# #S 3DROP <# #S #>

Обсудим? Вот код:
Код:
: ZLEN
  >R 0 BEGIN R@ OVER + C@ WHILE 1+ REPEAT  RDROP
;

\ Кстати, может заменить на ASCII ? Как у Броуди?
: CHAR PARSE C@ ;
: [CHAR] PARSE C@ LIT, ; IMMEDIATE



CREATE formats 256 CELLS ALLOT
VARIABLE str-posx

: FPRINT   \ ( str -- ) \ Печать с форматированием
  WHEREX str-posx !
  BEGIN DUP C@ DUP WHILE
    formats OVER -TH @ DUP
      IF
        NIP EXECUTE
      ELSE
        DROP EMIT
      THEN
    1+
  REPEAT
  2DROP
;

: StrFormat  \ ( char -- )
  formats SWAP -TH
  [C]HERE SWAP !
  ]
;

: StrFormat:  \ ( char -> )
  CHAR StrFormat
;

: ;StrFormat [COMPILE] ; ; IMMEDIATE

CREATE abc-nums 256 ALLOT
0xFF abc-nums 256 CFILL

HEX
0 abc-nums CHAR 0 + C!  8 abc-nums CHAR 8 + C!
1 abc-nums CHAR 1 + C!  9 abc-nums CHAR 9 + C!
2 abc-nums CHAR 2 + C!  A abc-nums CHAR A + C!
3 abc-nums CHAR 3 + C!  B abc-nums CHAR B + C!
4 abc-nums CHAR 4 + C!  C abc-nums CHAR C + C!
5 abc-nums CHAR 5 + C!  D abc-nums CHAR D + C!
6 abc-nums CHAR 6 + C!  E abc-nums CHAR E + C!
7 abc-nums CHAR 7 + C!  F abc-nums CHAR F + C!
DECIMAL

: gethex   \ ( addr -- addr1 num )
  0
  BEGIN  OVER C@ abc-nums + C@ DUP 0xFF = NOT WHILE
    SWAP 4 LSHIFT +
    SWAP 1+ SWAP
  REPEAT
  DROP
;

StrFormat: \  \ ( addr -- addr1 ) \ Экранирование символов (всех)
  1+ DUP C@ EMIT
;StrFormat

StrFormat: #  \ ( addr -- addr1 )
  DUP 1+ C@ [CHAR] / =
    IF
      1+ SWAP SETCOLOR
    ELSE
      DUP C@ EMIT
    THEN
;StrFormat

StrFormat: $  \ ( addr -- addr1 )
  DUP 1+ C@ [CHAR] / =
    IF
      1+ SWAP SETBGCOLOR
    ELSE
      DUP C@ EMIT
    THEN
;StrFormat

StrFormat: /  \ ( addr -- addr1 )
  DUP 1+ C@
  [CHAR] # OVER =
    IF
      DROP 2 +
      GETCOLOR SWAP
      gethex SETCOLOR
      1-
    ELSE
      [CHAR] $ =
        IF
          2 +
          GETBGCOLOR SWAP
          gethex SETBGCOLOR
          1-
        ELSE
          DUP C@ EMIT
        THEN
    THEN
;StrFormat

0xA StrFormat
  WHEREXY 1+ GOTOXY
;StrFormat

0xD StrFormat
  str-posx @ WHEREY GOTOXY
;StrFormat



256 ALLOT HERE 4 - VALUE PAD   \ Растет вниз. \ «4 -» - строка оканчивается нулем
VARIABLE PAD#

" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" VALUE nums-abc


: HOLD   \ ( char -- ) \ Вставить символ с кодом char в буфер форматного преобразования чисел.
  PAD PAD# @ - C!
  1 PAD# +!
;

: #   \ ( base num -- base num ) \ Выделить одну цифру с конца и добавить ее в буфер форматного преобразования чисел, оставив частное на стеке.
  OVER /MOD
  nums-abc + C@
  HOLD
;

: HOLDS   \ ( str -- ) \ Вставить строку в буфер форматного преобразования чисел.
  DUP ZLEN DUP ROT    \ len len str
  OVER PAD SWAP PAD# @ + - 1+  \ len len str addr
  ROT CMOVE                \ len str addr len
  PAD# +!
;

: #S   \ ( base num -- base num ) \ Преобразовать оставшуюся часть числа.
  BEGIN  OVER /MOD 2DUP OR  WHILE
    nums-abc + C@ HOLD
  REPEAT
  DROP
;

: {#   \ ( num base -- ? base num ) \ Начать форматное преобразование числа в системе счисления base
  OVER 0 MIN -1 MAX
  ROT ABS ROT SWAP
;

: #}   \ ( ? base num -- ) \ Закончить форматное преобразование числа.
  3DROP
  PAD PAD# @ - 1+
  PAD# OFF
;

: <#   \ ( num -- ? base num ) \ Начать форматное преобразование числа в текущей системе счисления.
  DUP 0 MIN -1 MAX SWAP
  ABS
  BASE @ SWAP
;

: #>   \ ( ? base num -- ) \ Закончить форматное преобразование числа.
  3DROP
  PAD PAD# @ - 1+
  PAD# OFF
;

: SIGN   \ ( ? base num -- ? base num ) \ Если число отрицательное, то вставить знак минуса в буфер форматного преобразования чисел.
  2 PICK IF [CHAR] - HOLD THEN
;

Пример:
Код:
5 3 GOTOXY
" Использование /#FF00FFнескольких#/cr/#0$/цветов/$0#/n /$0055FFв одной$/ строке"
DUP 34 + 0xD OVER C!  1+ 0xA SWAP C!
DUP 52 + 0xA SWAP C!
FPRINT

Результат:
Изображение

_________________
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc


Последний раз редактировалось VoidVolker Вс мар 29, 2009 11:21, всего редактировалось 1 раз.

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс мар 29, 2009 00:08 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Да, это хорошо, было бы ещё лучше, если доработать и сделать библиотеку с однообразными правилами применения (в частности файловый ввод-вывод также форматированный)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс мар 29, 2009 00:16 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6097
Благодарил (а): 14 раз.
Поблагодарили: 96 раз.
вопрос писал(а):
Да, это хорошо, было бы ещё лучше, если доработать и сделать библиотеку с однообразными правилами применения (в частности файловый ввод-вывод также форматированный)

EMIT - векторное слово. Правда, в FPRINT используется EMIT1 ("классический" EMIT на экран), но если заменить его именно на EMIT, то достаточно будет переопределять этот вектор, чтобы вывод шел в файл.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс мар 29, 2009 11:35 
Не в сети
Аватара пользователя

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1252
Благодарил (а): 3 раз.
Поблагодарили: 16 раз.
Хищник писал(а):
Правда, в FPRINT используется EMIT1

Ой, пардон, там конечно EMIT 8)
вопрос писал(а):
Да, это хорошо, было бы ещё лучше, если доработать и сделать библиотеку с однообразными правилами применения (в частности файловый ввод-вывод также форматированный)

FPRINT - именно для маленьких строк, раскрашиваемых "вручную": например вывод сообщения или запроса. А вот например для вывода на экран текстового буфера(файла) редактора, да еще и редактируемого в реальном времени, такая техника никак не подходит - слишком большие тормоза будут даже на файлах размеров в десятки килобайт - надо будет постоянно двигать массивы памяти огромные. Т.о. для этого нужен совершенно другой алгоритм форматирования, никак не связанный с содержимым строки, а значит все форматирование строки должно храниться за пределами самой строки.

_________________
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс мар 29, 2009 11:47 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Цитата:
Т.о. для этого нужен совершенно другой алгоритм форматирования, никак не связанный с содержимым строки, а значит все форматирование строки должно храниться за пределами самой строки.
не понимаю, во всех языках получается, а тут нет?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс мар 29, 2009 13:42 
Не в сети
Аватара пользователя

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1252
Благодарил (а): 3 раз.
Поблагодарили: 16 раз.
вопрос писал(а):
не понимаю, во всех языках получается, а тут нет?

А вот не надо подменять понятия - язык тут ни причем.
Вот пример: есть у нас строка в 10 мегабайт, и вот чтобы в начале строки вставить /#FF00FF, надо выделить новый буфер для нее размером 10мб+8байт, затем поместить туда /#FF00FF и еще дописать 10мб текста. Даже если строка уже в буфере, в любом случае двигать 10мб данных. Разве это будет быстро? А если нам надо сохранить строку без форматирования? Придется искать по всему буферу символы и группами их записывать в файл. Или произвести поиск текста /#FF00FF? Это усложнит алгоритм поиска. А если мы в реальном времени печатаем в начала текста - при каждом печатаемом символе надо будет двигать 10мб? Разве это будет быстро? Не думаю. Это же сколько работы надо сделать, только чтобы вывести сообщение? А тут 15 минут - и можно не напрягаясь выводить нужным цветом текст. Как любит говорить Хищник: "минимум работы - максимум эффекта". 8)

_________________
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс мар 29, 2009 15:48 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
VoidVolker писал(а):
вопрос писал(а):
не понимаю, во всех языках получается, а тут нет?

А вот не надо подменять понятия - язык тут ни причем.
Вот пример: есть у нас строка в 10 мегабайт, и вот чтобы в начале строки вставить /#FF00FF, надо выделить новый буфер для нее размером 10мб+8байт, затем поместить туда /#FF00FF и еще дописать 10мб текста. Даже если строка уже в буфере, в любом случае двигать 10мб данных. Разве это будет быстро? А если нам надо сохранить строку без форматирования? Придется искать по всему буферу символы и группами их записывать в файл. Или произвести поиск текста /#FF00FF? Это усложнит алгоритм поиска. А если мы в реальном времени печатаем в начала текста - при каждом печатаемом символе надо будет двигать 10мб? Разве это будет быстро? Не думаю. Это же сколько работы надо сделать, только чтобы вывести сообщение? А тут 15 минут - и можно не напрягаясь выводить нужным цветом текст. Как любит говорить Хищник: "минимум работы - максимум эффекта". 8)
Зачем строка 10 мБ? Это не строка а база данных, и подход соответствующий.

Пример совсем непонятен. Форматирование на уровне исходника осуществляет программист - в исходнике, т.е. случай
"чтобы в начале строки вставить /#FF00FF, " неадекватен, это как-раз означало бы, что форматирование осуществляется над неформатированной строкой програмными средствами :shock: и только затем передаётся функции форматированного вывода? Форматирование в строку вставляет программист для наглядности, чтобы не подсчитывать символы и не писать "на таком-то символе от начал строки вставить тэг (курсив)", для чего может понадобиться вставлять в исходник строки (а такой вид имеет только исходник строки) дополнительные маркеры форматирования ? ЕСли у нас есть строка, наждающаяся в форматировании, то это никак не предполагает, что её сначала нужно снабдить маркерами, а потом передать слову, которое эти маркеры понимает :o
МОжно (и нужно) сразу помещать результат обработки этих маркеров в строку-результат (строка-результат - это то, что мы выводим) и не пользоваться самими маркерами


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс мар 29, 2009 17:00 
Не в сети
Аватара пользователя

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1252
Благодарил (а): 3 раз.
Поблагодарили: 16 раз.
вопрос писал(а):
Зачем строка 10 мБ? Это не строка а база данных, и подход соответствующий.

Воот, я и говорю - для вывода простого сообщения нужного цвета вполне достаточно FPRINT.
А для создания и редактирования форматированных текстов нужно уже что-то подобное хтмл.

_________________
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн мар 30, 2009 00:44 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Цитата:
Воот, я и говорю - для вывода простого сообщения нужного цвета вполне достаточно FPRINT.
А для создания и редактирования форматированных текстов нужно уже что-то подобное хтмл.
Форматированный вывод и форматированный текст - совсем разные вещи. Форматированный вывод - это преобразование частей строки перед выводом. Форматированный текст - это способ представления текста. Т.е. в первом случае мы говорим о процедуре, а во втором - о результате.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB