Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пн окт 21, 2019 19:35

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 105 ]  На страницу 1, 2, 3, 4, 5 ... 7  След.
Автор Сообщение
 Заголовок сообщения: Что такое форматированный вывод и какой может быть в FORTH'е
СообщениеДобавлено: Пт апр 17, 2009 19:55 
Не в сети

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

Очень сжато, чтобы без воды
Форматированный вывод (имеется ввиду вывод строк) - это вывод строки с подстановкой некоторых элементов в нужном формате. Чуть точнее - это вывод строки с некоторыми элементами, которые вообще не являются частями строк и потому для попадания в строку должны быть преобразованы в соответствии с некоторой процедурой (или форматом). Классический пример: числа - они присутствуют в коде в в бинарном виде, для попадания должен принять символьный вид, причём могут быть выведены как 10-ричные, 16-ричные и много какие ещё. Кроме вида, элементы могут приобретать также положение в строке - скажем, выводиться выровненными или с определённым количеством знаков после запятой, с указанием или неуказанием знака, если речь о числах.
Видимо, окончательно будет так: Форматированный вывод - это вывод строки с преобразованием, при этом исходная строка включает в себя специальные поля, указывающие на некоторые элементы, а в получаемой строке эти поля заменяются на строчные представления элементов, вид и расположение которых образованы в соответствии с форматом.
Кажется, не громоздко.
Важно, что и исходным и конечным "продуктом" должна быть строка символов. Фактически, просто одни группы символов заменяются на другие группы символов. Строка на экране различными шрифтами или цветами, или строка отображаемая браузером как html, я думаю, в другом смысле отформатированная строка, нежели это имеется ввиду в термине "форматированный вывод". Новообразованная строка символов может попадать в файл (в поток), на экран, в другую строку, тем не менее это строка.
Разумеется, никто не может запретить называть форматированным выводом вывод строки, имеющую определённый вид (цвет...).
Однако изначально форматированный вывод, я полагаю - этот вывод строки, присутствующей в исходном тексте программы, с преобразованием.
Можно образовывать строку посимвольно :) , можно "конкат.",
например так
взять первый элемент новой строки из строки_1
образовать строку_2 преобразованием числа value
добавить строку_2 к новой строке
вывести новую строку

Заметим - уже 4 процедуры, а строк может быть ой как много
для каждой строки создавать набор процедур нелепо.
потому нагляднее, экономнее и логичнее влючить в исходную строку маркеры и задать одну, достаточно сложную в реализации, но стандартную и понятную в использовании процедуру преобразования.


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

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

Цитата:
7.3. Форматный вывод - функция PRINTF

Две функции: PRINTF для вывода и SCANF для ввода (следующий раздел) позволяют преобразовывать численные величины в символьное представлEние и обратно. Они также позволяют генерировать и интерпретировать форматные строки. Мы уже всюду в предыдущих главах неформально использовали функцию PRINTF; здесь приводится более полное и точное описание. Функция PRINTF(CONTROL, ARG1, ARG2, ...) преобразует, определяет формат и печатает свои аргументы в стандартный вывод под управлением строки CONTROL. Управляющая строка содержит два типа объектов: обычные символы, которые просто копируются в выходной поток, и спецификации преобразований, каждая из которых вызывает преобразование и печать очередного аргумента PRINTF.
Каждая спецификация преобразования начинается с символа % и заканчивается символом преобразования. Между % и символом преобразования могут находиться:
- знак минус, который указывает о выравнивании преобразован-
ного аргумента по левому краю его поля.
- Строка цифр, задающая минимальную ширину поля. Преобразо-
ванное число будет напечатано в поле по крайней мере этой
ширины, а если необходимо, то и в более широком. Если пре-
образованный аргумент имеет меньше символов, чем указанная
ширина поля, то он будет дополнен слева (или справа, если
было указано выравнивание по левому краю)заполняющими сим-
волами до этой ширины. Заполняющим символом обычно являет-
ся пробел, а если ширина поля указывается с лидирующим ну-
лем, то этим символом будет нуль (лидирующий нуль в данном
случае не означает восьмеричной ширины поля).
- Точка, которая отделяет ширину поля от следующей строки
цифр.
- Строка цифр (точность), которая указывает максимальное
число символов строки, которые должны быть напечатаны, или
число печатаемых справа от десятичной точки цифр для пере-
менных типа FLOAT или DOUBLE.
- Модификатор длины L, который указывает, что соответствую-
щий элемент данных имеет тип LONG, а не INT.
Ниже приводятся символы преобразования и их смысл:

D - аргумент преобразуется к десятичному виду.
O - Аргумент преобразуется в беззнаковую восьмеричную форму
(без лидирующего нуля).
X - Аргумент преобразуется в беззнаковую шестнадцатеричную
форму (без лидирующих 0X).
U - Аргумент преобразуется в беззнаковую десятичную форму.
C - Аргумент рассматривается как отдельный символ.
S - Аргумент является строкой: символы строки печатаются до
тех пор, пока не будет достигнут нулевой символ или не бу-
дет напечатано количество символов, указанное в специфика-
ции точности.
E - Аргумент, рассматриваемый как переменная типа FLOAT или
DOUBLE, преобразуется в десятичную форму в виде
[-]M.NNNNNNE[+-]XX, где длина строки из N определяется
указанной точностью. Точность по умолчанию равна 6.
F - Аргумент, рассматриваемый как переменная типа FLOAT или
DOUBLE, преобразуется в десятичную форму в виде
[-]MMM.NNNNN, где длина строки из N определяется указанной
точностью. Точность по умолчанию равна 6. отметим, что эта
точность не определяет количество печатаемых в формате F
значащих цифр.
G - Используется или формат %E или %F, какой короче; незначащие нули не печатаются.

Если идущий за % символ не является символом преобразования, то печатается сам этот символ; следовательно, символ % можно напечатать, указав %%. Большинство из форматных преобразований очевидно и было
проиллюстрировано в предыдущих главах. Единственным исключением является то, как точность взаимодействует со строками. Следующая таблица демонстрирует влияние задания различных спецификаций на печать "HELLO, WORLD" (12 символов). Мы поместили двоеточия вокруг каждого поля для того, чтобы вы могли видеть его протяженность.

:%10S: :HELLO, WORLD:
:%10-S: :HELLO, WORLD:
:%20S: : HELLO, WORLD:
:%-20S: :HELLO, WORLD :
:%20.10S: : HELLO, WOR:
:%-20.10S: :HELLO, WOR :
:%.10S: :HELLO, WOR:

Предостережение: PRINTF использует свой первый аргумент для определения числа последующих аргументов и их типов. Если количество аргументов окажется недостаточным или они будут иметь несоответственные типы, то возникнет путаница и вы получите бессмысленные результаты.
прошу прощения за длинную цитату.


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

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

При этом по моему скромному мнению, форт позволяет несколько большую гибкость, нежели другие языки.

Обратим внимание только на 2 обстоятельства
  1. функция преобразования достаточно проста: есть код (назовём "код А") который проходит по строке и выполняет (1) перемещение символов в новую строку если не встретился символ преобразования (%) (2) вызов кода, который осуществляет собственно преобразование, таковой ("код В") расшифровывает задачу преобразования и ... преобразует
  2. эти оба кода "зашиты" в библиотеку С и не позволяют так просто собою манипулировать - являются более-менее стандартными


самое простое, что мог бы предложить Форт?
оба кода (А и В) можно менять, подстраиваясь под конкретную задачу, скажем (далеко не всё, разумеется) можно менять символ преобразования. Если нам очень не хочется использовать %, можно заменить его на другой, даже многосимвольный, тогда это будет не символ, а "слово преобразования" - для этого мы меняем код "А" . Более того, мы в принципе можем указывать имя преобразователя прямо в строках как префикс

меняя код "В" можно (динамически) менять тип преобразования данного элемента строки в зависимости от ситуации текущей в процессе выполнения алгоритма.


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

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
С таким определением "форматного вывода" - Фигурально выражаясь - любой исходник на Форте - строка для форматного вывода текста (результата работы этого исходника), заточенная под конкретную задачу.

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4997
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 20 раз.
Поблагодарили: 58 раз.
: sample <# #S HOLDS #> TYPE ;

S" Print a number: " 123123 sample

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


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

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

P.S. Я очень старался, но у меня, может не получилось "самое лучшее определение"


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

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
вопрос писал(а):
Это почему?

Потому что все сказанное в фразе:

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


в обобщенном смысле подходит и для исходного текста на форте.

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Последний раз редактировалось WingLion Пт апр 17, 2009 20:20, всего редактировалось 1 раз.

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

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
mOleg писал(а):
: sample <# #S HOLDS #> TYPE ;

S" Print a number: " 123123 sample

Ну хорошо, а если строка сложнее и нужно преобразовывать в разные форматы? Каждый раз <# #> ?


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

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6808
Благодарил (а): 16 раз.
Поблагодарили: 110 раз.
вопрос писал(а):
Ну хорошо, а если строка сложнее и нужно преобразовывать в разные форматы? Каждый раз <# #> ?

А разве лучше предлагаемая альтернатива всем разработчикам транслятором реализовывать громоздкие конструкции и следить за корректностью их реализации, а программистам на Форте - скрупулезно изучать тонкости форматов?


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

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

Но мы же не выводим сами слова форта, многие слова исходника вообще не имеют отношения к выводу, некоторые заняты вводом, некоторые ещё чем-то, т.е. выводимую строку исходник форта не образует.


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4997
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 20 раз.
Поблагодарили: 58 раз.
вопрос писал(а):
Ну хорошо, а если строка сложнее и нужно преобразовывать в разные форматы? Каждый раз <# #> ?

ну, можно взять форк, там в дополнение к стандартным есть еще такие конструкции:

{# $ #}

<| KEEP KEEPS |>

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


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

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

А разве лучше предлагаемая альтернатива всем разработчикам транслятором реализовывать громоздкие конструкции и следить за корректностью их реализации, а программистам на Форте - скрупулезно изучать тонкости форматов?
Это можно рассмотреть только на примерах. Мне представляется по крайне мере, что ...
если библиотека будет реализована на стандартных словах Форта, тех же <# #> , т.е. будет обладать переносимостью ( а код не так уж сложен, всего 2 части с понятным поведением - см. выше), это не создаст дополнительных трудностей


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

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

ну, можно взять форк, там в дополнение к стандартным есть еще такие конструкции:

{# $ #}

<| KEEP KEEPS |>
можно рассмотреть на примерах

:) кроме того, если это только в форке :(


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4997
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 20 раз.
Поблагодарили: 58 раз.
вопрос писал(а):
кроме того, если это только в форке

под СПФ была либа и даже статья была про форматированный вывод на вики (да что=то там потерлось все)
да, либа лежит в devel\~moleg\lib\spf_print (там есть и описание с примерами: spf_print.dsc)

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


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

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6808
Благодарил (а): 16 раз.
Поблагодарили: 110 раз.
вопрос писал(а):
если библиотека будет реализована на стандартных словах Форта, тех же <# #> , т.е. будет обладать переносимостью ( а код не так уж сложен, всего 2 части с понятным поведением - см. выше), это не создаст дополнительных трудностей

Любое усложнение форт-машины, которое претендует на высокую распространенность, создает дополнительные трудности.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 105 ]  На страницу 1, 2, 3, 4, 5 ... 7  След.

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


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

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


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

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