Module Fmt
Format
pretty-printer combinators.
Consult naming conventions for your pretty-printers.
References
- The
Format
module documentation. - The required reading
Format
module tutorial.
Standard outputs
Formatting
val pf : Stdlib.Format.formatter -> ('a, Stdlib.Format.formatter, unit) Stdlib.format -> 'a
pf
isFormat
.fprintf.
val str : ('a, Stdlib.Format.formatter, unit, string) Stdlib.format4 -> 'a
str
isFormat
.asprintf.Note. When using
strf
utf_8
andstyle_renderer
are always respectively set totrue
and`None
. See alsostr_like
.
val kpf : (Stdlib.Format.formatter -> 'a) -> Stdlib.Format.formatter -> ('b, Stdlib.Format.formatter, unit, 'a) Stdlib.format4 -> 'b
kpf
isFormat
.kfprintf.
val kstr : (string -> 'a) -> ('b, Stdlib.Format.formatter, unit, 'a) Stdlib.format4 -> 'b
kstr
is likestr
but continuation based.
val str_like : Stdlib.Format.formatter -> ('a, Stdlib.Format.formatter, unit, string) Stdlib.format4 -> 'a
str_like ppf
is likestr
except itsutf_8
andstyle_renderer
settings are those ofppf
.
val with_buffer : ?like:Stdlib.Format.formatter -> Stdlib.Buffer.t -> Stdlib.Format.formatter
with_buffer ~like b
is a formatter whoseutf_8
andstyle_renderer
settings are copied from those oflike
(if provided).
val failwith : ('a, Stdlib.Format.formatter, unit, 'b) Stdlib.format4 -> 'a
failwith
iskstr failwith
, raisesStdlib
.Failure with a pretty-printed string argument.
val failwith_notrace : ('a, Stdlib.Format.formatter, unit, 'b) Stdlib.format4 -> 'a
failwith_notrace
is likefailwith
but raises withraise_notrace
.
val invalid_arg : ('a, Stdlib.Format.formatter, unit, 'b) Stdlib.format4 -> 'a
invalid_arg
iskstr invalid_arg
, raisesStdlib
.Invalid_argument with a pretty-printed string argument.
Formatters
val flush : 'a t
flush
has the effect ofFormat
.pp_print_flush
val nop : 'a t
nop
formats nothing.
val any : (unit, Stdlib.Format.formatter, unit) Stdlib.format -> 'a t
any fmt ppf v
formats any value with the constant formatfmt
.
val fmt : ('a, Stdlib.Format.formatter, unit) Stdlib.format -> Stdlib.Format.formatter -> 'a
fmt fmt ppf
ispf ppf fmt
. Iffmt
is used with a single non-constant formatting directive, generates a value of typet
.
Separators
val cut : 'a t
cut
has the effect ofFormat
.pp_print_cut.
val sp : 'a t
sp
has the effect ofFormat
.pp_print_space.
val sps : int -> 'a t
sps n
has the effect ofFormat
.pp_print_breakn 0
.
Sequencing
val concat : ?sep:unit t -> 'a t list -> 'a t
concat ~sep pps
formats a value using the formaterspps
and separting each format withsep
(defaults tocut
).
Boxes
val box : ?indent:int -> 'a t -> 'a t
box ~indent pp ppf
wrapspp
in a pretty-printing box. The box tries to print as much as possible on every line, while emphasizing the box structure (seeFormat
.pp_open_box). Break hints that lead to a new line addindent
to the current indentation (defaults to0
).
val hbox : 'a t -> 'a t
hbox
is likebox
but is a horizontal box: the line is not split in this box (but may be in sub-boxes). SeeFormat
.pp_open_hbox.
val vbox : ?indent:int -> 'a t -> 'a t
vbox
is likebox
but is a vertical box: every break hint leads to a new line which addsindent
to the current indentation (defaults to0
). SeeFormat
.pp_open_vbox.
Brackets
Records
Stdlib types
Formatters for structures give full control to the client over the formatting process and do not wrap the formatted structures with boxes. Use the Dump
module to quickly format values for inspection.
val bool : bool t
bool
isFormat
.pp_print_bool.
val int : int t
int
ispf ppf "%d"
.
val nativeint : nativeint t
nativeint ppf
ispf ppf "%nd"
.
val int32 : int32 t
int32 ppf
ispf ppf "%ld"
.
val int64 : int64 t
int64 ppf
ispf ppf "%Ld"
.
val uint : int t
uint ppf
ispf ppf "%u"
.
val unativeint : nativeint t
unativeint ppf
ispf ppf "%nu"
.
val uint32 : int32 t
uint32 ppf
ispf ppf "%lu"
.
val uint64 : int64 t
uint64 ppf
ispf ppf "%Lu"
.
val float : float t
float ppf
ispf ppf "%g".
val float_dfrac : int -> float t
float_dfrac d
rounds the float to thed
th decimal fractional digit and formats the result with"%g"
. Ties are rounded towards positive infinity. The result is only defined for0 <= d <= 16
.
val float_dsig : int -> float t
float_dsig d
rounds the normalized decimal significand of the float to thed
th decimal fractional digit and formats the result with"%g"
. Ties are rounded towards positive infinity. The result is NaN on infinities and only defined for0 <= d <= 16
.Warning. The current implementation overflows on large
d
and floats.
val char : char t
char
isFormat
.pp_print_char.
val string : string t
string
isFormat
.pp_print_string.
val buffer : Stdlib.Buffer.t t
buffer
formats aBuffer
.t value's current contents.
val exn : exn t
exn
formats an exception.
val exn_backtrace : (exn * Stdlib.Printexc.raw_backtrace) t
exn_backtrace
formats an exception backtrace.
val pair : ?sep:unit t -> 'a t -> 'b t -> ('a * 'b) t
pair ~sep pp_fst pp_snd
formats a pair. The first and second projection are formatted usingpp_fst
andpp_snd
and are separated bysep
(defaults tocut
).
val option : ?none:unit t -> 'a t -> 'a option t
option ~none pp_v
formats an optional value. TheSome
case usespp_v
andNone
usesnone
(defaults tonop
).
val result : ok:'a t -> error:'b t -> ('a, 'b) Stdlib.result t
result ~ok ~error
formats a result value usingok
for theOk
case anderror
for theError
case.
val list : ?sep:unit t -> 'a t -> 'a list t
list sep pp_v
formats list elements. Each element of the list is formatted in order withpp_v
. Elements are separated bysep
(defaults tocut
). If the list is empty, this isnop
.
val array : ?sep:unit t -> 'a t -> 'a array t
array sep pp_v
formats array elements. Each element of the array is formatted in order withpp_v
. Elements are separated bysep
(defaults tocut
). If the array is empty, this isnop
.
val seq : ?sep:unit t -> 'a t -> 'a Stdlib.Seq.t t
seq sep pp_v
formats sequence elements. Each element of the sequence is formatted in order withpp_v
. Elements are separated bysep
(defaults tocut
). If the sequence is empty, this isnop
.
val hashtbl : ?sep:unit t -> ('a * 'b) t -> ('a, 'b) Stdlib.Hashtbl.t t
hashtbl ~sep pp_binding
formats the bindings of a hash table. Each binding is formatted withpp_binding
and bindings are separated bysep
(defaults tocut
). If the hash table has multiple bindings for a given key, all bindings are formatted, with the most recent binding first. If the hash table is empty, this isnop
.
val queue : ?sep:unit t -> 'a t -> 'a Stdlib.Queue.t t
queue ~sep pp_v
formats queue elements. Each element of the queue is formatted in least recently added order withpp_v
. Elements are separated bysep
(defaults tocut
). If the queue is empty, this isnop
.
val stack : ?sep:unit t -> 'a t -> 'a Stdlib.Stack.t t
stack ~sep pp_v
formats stack elements. Each element of the stack is formatted from top to bottom order withpp_v
. Elements are separated bysep
(defaults tocut
). If the stack is empty, this isnop
.
module Dump : sig ... end
Formatters for inspecting OCaml values.
Magnitudes
val si_size : scale:int -> string -> int t
si_size ~scale unit
formats a non negative integer representing unitunit
at scale 10scale * 3, depending on its magnitude, using power of 3 SI prefixes (i.e. all of them except deca, hector, deci and centi). Only US-ASCII characters are used,µ
(10-6) is written usingu
.scale
indicates the scale 10scale * 3 an integer represents, for example-1
for munit
(10-3),0
forunit
(100),1
forkunit
(103); it must be in the range [-8
;8
] orInvalid_argument
is raised.Except at the maximal yotta scale always tries to show three digits of data with trailing fractional zeros omited. Rounds towards positive infinity (over approximates).
val byte_size : int t
byte_size
issi_size ~scale:0 "B"
.
val bi_byte_size : int t
bi_byte_size
formats a byte size according to its magnitude using binary prefixes up to pebi bytes (215).
val uint64_ns_span : int64 t
uint64_ns_span
formats an unsigned nanosecond time span according to its magnitude using SI prefixes on seconds and accepted non-SI units. Years are counted in Julian years (365.25 SI-accepted days) as defined by the International Astronomical Union (IAU). Only US-ASCII characters are used (us
is used forµs
).
Binary data
type 'a vec
= int * (int -> 'a)
The type for random addressable, sized sequences. Each
(n, f)
represents the sequencef 0, ..., f (n - 1)
.
val ascii : ?w:int -> ?subst:unit t -> unit -> char vec t
ascii ~w ~subst ()
formats character sequences by printing characters in the printable US-ASCII range ([0x20];[0x7E]
) as is, and replacing the rest withsubst
(defaults tofmt "."
).w
causes the output to be right padded to the size of formatting at leastw
sequence elements (defaults to0
).
val octets : ?w:int -> ?sep:unit t -> unit -> char vec t
octets ~w ~sep ()
formats character sequences as hexadecimal digits. It prints groups of successive characters of unspecified length together, separated bysep
(defaults tosp
).w
causes the output to be right padded to the size of formatting at leastw
sequence elements (defaults to0
).
Words, paragraphs, text and lines
Note. These functions only work on US-ASCII strings and/or with newlines ('\n'
). If you are dealing with UTF-8 strings or different kinds of line endings you should use the pretty-printers from Uuseg_string
.
White space. White space is one of the following US-ASCII characters: space ' '
(0x20
), tab '\t'
(0x09
), newline '\n'
(0x0A
), vertical tab (0x0B
), form feed (0x0C
), carriage return '\r'
(0x0D
).
val words : string t
words
formats words by suppressing initial and trailing white space and replacing consecutive white space with a singleFormat
.pp_print_space.
val paragraphs : string t
paragraphs
formats paragraphs by suppressing initial and trailing spaces and newlines, replacing blank lines (a line made only of white space) by a twoFormat
.pp_force_newline and remaining consecutive white space with a singleFormat
.pp_print_space.
val text : string t
text
formats text by respectively replacing spaces and newlines in the string withFormat
.pp_print_space andFormat
.pp_force_newline.
val lines : string t
lines
formats lines by replacing newlines ('\n'
) in the string with calls toFormat
.pp_force_newline.
val truncated : max:int -> string t
truncated ~max
formats a string using at mostmax
characters. If the string doesn't fit, it is truncated and ended with three consecutive dots which do count towardsmax
.
val text_loc : ((int * int) * (int * int)) t
text_loc
formats a line-column text range according to GNU conventions.
HCI fragments
val one_of : ?empty:unit t -> 'a t -> 'a list t
one_of ~empty pp_v ppf l
formats according to the length ofl
0
, formatsempty
(defaults tonop
).1
, formats the element withpp_v
.2
, formats"either %a or %a"
with the list elementsn
, formats"one of %a, ... or %a"
with the list elements
val did_you_mean : ?pre:unit t -> ?post:unit t -> kind:string -> 'a t -> ('a * 'a list) t
did_you_mean ~pre kind ~post pp_v
formats a faulty valuev
of kindkind
and a list ofhints
thatv
could have been mistaken for.pre
defaults tounit "Unknown"
,post
tonop
they surround the faulty value before the "did you mean" part as follows"%a %s %a%a." pre () kind pp_v v post ()
. Ifhints
is empty no "did you mean" part is printed.
Conditional UTF-8 formatting
Note. Since Format
is not UTF-8 aware using UTF-8 output may derail the pretty printing process. Use the pretty-printers from Uuseg_string
if you are serious about UTF-8 formatting.
val if_utf_8 : 'a t -> 'a t -> 'a t
if_utf_8 pp_u pp ppf v
is:pp_u ppf v
ifutf_8 ppf
istrue
.pp ppf v
otherwise.
val utf_8 : Stdlib.Format.formatter -> bool
utf_8 ppf
istrue
if UTF-8 output is enabled onppf
. Ifset_utf_8
hasn't been called onppf
this istrue
.
Styled formatting
type color
=[
|
`Black
|
`Blue
|
`Cyan
|
`Green
|
`Magenta
|
`Red
|
`White
|
`Yellow
]
The type for colors.
type style
=[
|
`None
|
`Bold
|
`Faint
|
`Italic
|
`Underline
|
`Reverse
|
`Fg of [ color | `Hi of color ]
|
`Bg of [ color | `Hi of color ]
|
color
]
The type for styles:
`None
resets the styling.`Bold
,`Faint
,`Italic
,`Underline
and`Reverse
are display attributes.`Fg _
is the foreground color or high-intensity color on`Hi _
.`Bg _
is the foreground color or high-intensity color on`Hi _
.#color
is the foreground colour, deprecated use`Fg #color
instead.
Style rendering control
type style_renderer
=[
|
`Ansi_tty
|
`None
]
The type for style renderers.
`Ansi_tty
, renders styles using ANSI escape sequences.`None
, styled rendering has no effect.
val style_renderer : Stdlib.Format.formatter -> style_renderer
style_renderer ppf
is the style renderer used byppf
. Ifset_style_renderer
has never been called onppf
this is`None
.
val set_style_renderer : Stdlib.Format.formatter -> style_renderer -> unit
set_style_renderer ppf r
sets the style renderer ofppf
tor
.- raises Invalid_argument
if
ppf
isFormat
.str_formatter: its renderer is always`None
.
Converting with string value converters
val of_to_string : ('a -> string) -> 'a t
of_to_string f ppf v
isstring ppf (f v)
.
val to_to_string : 'a t -> 'a -> string
to_to_string pp_v v
isstrf "%a" pp_v v
.
Deprecated
val strf : ('a, Stdlib.Format.formatter, unit, string) Stdlib.format4 -> 'a
- deprecated
use
str
instead.
val kstrf : (string -> 'a) -> ('b, Stdlib.Format.formatter, unit, 'a) Stdlib.format4 -> 'b
- deprecated
use
kstr
instead.
val strf_like : Stdlib.Format.formatter -> ('a, Stdlib.Format.formatter, unit, string) Stdlib.format4 -> 'a
- deprecated
use
str_like
instead.
Naming conventions
Given a type ty
use:
pp_ty
for a pretty printer that provides full control to the client and does not wrap the formatted value in an enclosing box. See these examples.pp_dump_ty
for a pretty printer that provides little control over the pretty-printing process, wraps the rendering in an enclosing box and tries as much as possible to respect the OCaml syntax. These pretty-printers should make it easy to inspect and understand values of the given type, they are mainly used for quick printf debugging and/or toplevel interaction. See these examples.
If you are in a situation where making a difference between dump_ty
and pp_ty
doesn't make sense then use pp_ty
.
For a type ty
that is the main type of the module (the "M.t
" convention) drop the suffix, that is simply use M.pp
and M.pp_dump
.