Spec-Zone.ru › Haskell 7

Text.PrettyPrint.HughesPJ

Авторские права (c) Университет Глазго 2001
Лицензия BSD-стиль (см. файл LICENSE)
Поддержка David Terei <code@davidterei.com>
Устойчивость стабильная
Переносимость переносимая
Safe Haskell Безопасная
Язык Haskell98

Содержание

  • Тип документа
  • Создание документов
    • Преобразование значений в документы
    • Простые производные документы
    • Оборачивание документов разделителями
    • Объединение документов
  • Предикаты для документов
  • Утилиты для документов
  • Вывод документов
    • Вывод по умолчанию
    • Вывод с определенным стилем
    • Общий вывод

Описание

Комбинаторы Pretty Printer Джона Хьюза и Саймона Пейтона Джонса

Основано на Проектирование библиотеки Pretty-печати в Advanced Functional Programming, Johan Jeuring и Erik Meijer (ред.), LNCS 925 http://www.cs.chalmers.se/~rjmh/Papers/pretty.ps

Тип документа

data Doc Исходный код

Абстрактный тип документов. Doc представляет *множество* макетов. Doc без вхождений Union или NoDoc представляет только один макет.

Примеры реализации

Eq Doc
Show Doc
IsString Doc
Generic Doc
Monoid Doc
NFData Doc
type Rep Doc

data Детали текста Исходный код

Тип данных TextDetails

TextDetails представляет фрагмент текста, который будет выведен в какой-то момент.

Конструкторы

Символ !Символ

Фрагмент одного символа

Строка Строка

Целый фрагмент строки

PStr Строка

Использовался для представления фрагмента Fast String, но сейчас устарел и идентичен конструктору Str.

Примеры реализации

Eq Детали текста
Show Детали текста
Generic Детали текста
NFData Детали текста
type Rep Детали текста

Создание документов

Преобразование значений в документы

char :: Char -> Doc Source

Документ высоты и ширины 1, содержащий литерный символ.

text :: String -> Doc Source

Документ высоты 1, содержащий литерную строку. text удовлетворяет следующим законам:

  • text s <> text t = text (s++t)
  • text "" <> x = x, если x не пустая

Побочное условие последнего закона необходимо, потому что text "" имеет высоту 1, а empty не имеет высоты.

ptext :: String -> Doc Source

То же, что и text. Раньше использовался для байтовых строк.

sizedText :: Int -> String -> Doc Source

Некоторая строка с любой шириной. (text s = sizedText (length s) s)

zeroWidthText :: String -> Doc Source

Некоторая строка, но без ширины. Используется для непечатаемого текста, такого как теги HTML или LaTeX.

int Source

Аргументы

:: Int
-> Doc
int n = text (show n)

integer Source

Аргументы

:: Integer
-> Doc
integer n = text (show n)

float Source

Аргументы

:: Float
-> Doc
float n = text (show n)

double Source

Аргументы

:: Double
-> Doc
double n = text (show n)

rational Source

Аргументы

:: Rational
-> Doc
rational n = text (show n)

Простые производные документы

semi Source

Аргументы

:: Doc

Символ ';'

comma Source

Аргументы

:: Doc

Символ ',', запятая

colon Source

Аргументы

:: Doc

Символ :

space Source

Аргументы

:: Doc

Пробел

equals Source

Аргументы

:: Doc

Символ '='

lparen Source

Аргументы

:: Doc

Символ '('

rparen Source

Аргументы

:: Doc

Символ ')'

lbrack Source

Аргументы

:: Doc

Символ '['

rbrack Source

Аргументы

:: Doc

Символ ']'

lbrace Source

Аргументы

:: Doc

Символ '{'

rbrace Source

Аргументы

:: Doc

Символ '}'

Оборачивание документов в разделители

parens Source

Аргументы

:: Doc
-> Doc

Оборачивает документ в (...)

brackets Source

Аргументы

:: Doc
-> Doc

Оборачивает документ в [...]

braces Source

Аргументы

:: Doc
-> Doc

Оборачивает документ в {...}

quotes Source

Аргументы

:: Doc
-> Doc

Оборачивает документ в '...'

doubleQuotes Source

Аргументы

:: Doc
-> Doc

Оборачивает документ в "..."

maybeParens :: Bool -> Doc -> Doc Source

Применяет parens к Doc, если булево значение истинно.

maybeBrackets :: Bool -> Doc -> Doc Source

Применяет brackets к Doc, если булево значение истинно.

maybeBraces :: Bool -> Doc -> Doc Source

Применяет braces к Doc, если булево значение истинно.

maybeQuotes :: Bool -> Doc -> Doc Source

Применяет quotes к Doc, если булево значение истинно.

maybeDoubleQuotes :: Bool -> Doc -> Doc Source

Применяет doubleQuotes к Doc, если булево значение истинно.

Комбинирование документов

empty :: Doc Source

Пустой документ, без высоты и ширины. empty является тождественным элементом для <>, <+>, $$ и $+$, и где угодно в списке аргументов для sep, hcat, hsep, vcat, fcat и т.д.

(<>) :: Doc -> Doc -> Doc infixl 6 Source

Рядом. <> является ассоциативным, с тождественным элементом empty

(<+>) :: Doc -> Doc -> Doc infixl 6 Source

Рядом, разделенные пробелом, если один из аргументов не empty. <+> является ассоциативным, с тождественным элементом empty

hcat :: [Doc] -> Doc Source

Список версия <>

hsep :: [Doc] -> Doc Source

Список версия <+>.

($$) :: Doc -> Doc -> Doc infixl 5 Source

Вышесказанное, за исключением того, что если последняя строка первого аргумента заканчивается хотя бы на одну позицию раньше, чем начинается первая строка второго, эти две строки перекрываются. Например:

   text "hi" $$ nest 5 (text "there")

выводится как

   hi   there

а не как

   hi
        there

$$ ассоциативна, с тождественным элементом empty, и также удовлетворяет

  • (x $$ y) <> z = x $$ (y <> z), если y не пусто.

($+$) :: Doc -> Doc -> Doc infixl 5 Source

Вышесказанное, без перекрытия. $+$ ассоциативна, с тождественным элементом empty.

vcat :: [Doc] -> Doc Source

Список версия $$.

sep :: [Doc] -> Doc Source

Либо hsep либо vcat.

cat :: [Doc] -> Doc Source

Либо hcat либо vcat.

fsep :: [Doc] -> Doc Source

"Абзац заполнения" версия sep.

fcat :: [Doc] -> Doc Source

"Абзац заполнения" версия cat.

nest :: Int -> Doc -> Doc Source

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

  • nest 0 x = x
  • nest k (nest k' x) = nest (k+k') x
  • nest k (x <> y) = nest k z <> nest k y
  • nest k (x $$ y) = nest k x $$ nest k y
  • nest k empty = empty
  • x <> nest k y = x <> y, если x не пусто

Дополнительное условие для последнего закона необходимо, потому что empty является левым тождественным элементом для <>.

hang :: Doc -> Int -> Doc -> Doc Source

hang d1 n d2 = sep [d1, nest n d2]

punctuate :: Doc -> [Doc] -> [Doc] Source

punctuate p [d1, ... dn] = [d1 <> p, d2 <> p, ... dn-1 <> p, dn]

Предикаты для документов

isEmpty :: Doc -> Bool Source

Возвращает True, если документ пуст

Функции для работы с документами

first :: Doc -> Doc -> Doc Источник

first возвращает свой первый аргумент, если он не пуст, в противном случае — второй.

reduceDoc :: Doc -> RDoc Источник

Выполняет некоторое упрощение созданного GDoc.

Вывод документов

Вывод по умолчанию

render :: Doc -> String Источник

Выводит Doc в строку, используя параметры по умолчанию Style.

Вывод с определенным стилем

data Style Источник

Стиль вывода.

Конструкторы

Style

Поля

mode :: Mode

Режим вывода

lineLength :: Int

Длина строки, в символах

ribbonsPerLine :: Float

Отношение длины строки к длине ленты

Примеры использования

Eq Style
Show Style
Generic Style
type Rep Style

style :: Style Источник

Стиль по умолчанию (mode=PageMode, lineLength=100, ribbonsPerLine=1.5).

renderStyle :: Style -> Doc -> String Источник

Выводит Doc в строку, используя заданный Style.

data Mode Источник

Режим вывода.

Конструкторы

PageMode

Обычный

ZigZagMode

Со зигзагообразными вырезами

LeftMode

Без отступов, бесконечно длинные строки

OneLineMode

Все в одной строке

Примеры

Eq Режим
Show Режим
Generic Режим
type Rep Режим

Общие параметры рендеринга

fullRender Исходный код

Аргументы

:: Режим

Режим рендеринга

-> Целое

Длина строки

-> Вещественное число

Ленты на строку

-> (Детали текста -> a -> a)

Что делать с текстом

-> a

Что делать в конце

-> Документ

Документ

-> a

Результат

Интерфейс общего рендеринга.

© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/7.10.3/docs/html/libraries/pretty-1.1.2.0/Text-PrettyPrint-HughesPJ.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API