The current version of SWI-Prolog provides two formatted write predicates. The first is writef/[1,2], which is compatible with Edinburgh C-Prolog. The second is format/[1,2], which is compatible with Quintus Prolog. We hope the Prolog community will once define a standard formatted write predicate. If you want performance use format/[1,2] as this predicate is defined in C. Otherwise compatibility reasons might tell you which predicate to use.
write(Term), nl.
writef(Atom, []).
Escape sequences to generate a single special character:
\n | Output a nemline character (see also nl/[0,1]) |
\l | Output a line separator
(same as \n ) |
\r | Output a carriage-return character (ASCII 13) |
\t | Output the ASCII character TAB (9) |
\\ | The character
is output |
\% | The character
is output |
\nnn | where <nnn> is an integer (1-3 digits) the character with ASCII code <nnn> is output (NB : <nnn> is read as decimal) |
Note that \l
, \nnn
and \\
are
interpreted differently when character-escapes are in effect. See
section 2.14.1.1.
Escape sequences to include arguments from Arguments. Each time a % escape sequence is found in Format the next argument from Arguments is formatted according to the specification.
%t | print/1 the next item (mnemonic: term) |
%w | write/1 the next item |
%q | writeq/1 the next item |
%d | Write the term, ignoring operators. See also write_term/2. Mnemonic: old Edinburgh display/1. |
%p | print/1
the next item (identical to %t ) |
%n | Put the next item as a character (i.e. it is an ASCII value) |
%r | Write the next item N times where N is the second item (an integer) |
%s | Write the next item as a String (so it must be a list of characters) |
%f | Perform a ttyflush/0 (no items used) |
%Nc | Write the next item Centered in N columns. |
%Nl | Write the next item Left justified in N columns. |
%Nr | Write the next item Right justified in N columns. N is a decimal number with at least one digit. The item must be an atom, integer, float or string. |
?- swritef(S, '%15L%w', ['Hello', 'World']). S = "Hello World" |
swritef(String, Format, []).
format(Format) :- format(Format, []).
'
Special sequences start with the tilde (
),
followed by an optional numeric argument, followed by a character
describing the action to be undertaken. A numeric argument is either a
sequence of digits, representing a positive decimal number, a sequence ~
`<character>
,
representing the ASCII value of the character (only useful for
~t
) or a asterisk (
), in when
the numeric argument is taken from the next argument of the argument
list, which should be a positive integer. Actions are:
*
~
a
c
d
D
e
E
f
g
G
i
k
n
N
p
q
r
~16r
prints its argument hexadecimal. The argument should
be in the range [2, ... , 36]. Lower case letters are used
for digits above 9.
R
s
t
~t
statements between the tabs tops. This space is padded
with spaces by default. If an argument is supplied this is taken to be
the ASCII value of the character used for padding. This can be used to
do left or right alignment, centering, distributing, etc. See also
~|
and ~+
to set tab stops. A tabs top is
assumed at the start of each line.
|
~t
's to be distributed between the previous and this tabs
top.
+
~|
.
w
Example:
simple_statistics :- <obtain statistics> % left to the user format('~tStatistics~t~72|~n~n'), format('Runtime: ~`.t ~2f~34| Inferences: ~`.t ~D~72|~n', [RunT, Inf]), .... |
Will output
Statistics Runtime: .................. 3.45 Inferences: .......... 60,345 |
?- sformat(S, '~w~t~15|~w', ['Hello', 'World']). S = "Hello World" |
sformat(String, Format, []).
'
~c
(tilde, followed by some character) is
found, the format derivatives will first check whether the user has
defined a predicate to handle the format. If not, the built in
formatting rules described above are used. Char is either an ASCII
value, or a one character atom, specifying the letter to be (re)defined. Head
is a term, whose name and arity are used to determine the predicate to
call for the redefined formatting character. The first argument to the
predicate is the numeric argument of the format command, or the atom default
if no argument is specified. The remaining arguments are filled from the
argument list. The example below redefines ~n
to produce Arg
times return followed by linefeed (so a (Grr.) DOS machine is happy with
the output).
:- format_predicate(n, dos_newline(_Arg)). dos_newline(Arg) :- between(1, Ar, _), put(13), put(10), fail ; true. |
user
, Head is
qualified with the definition module of the predicate.