ADDED: format/3, writing formatted output to a stream

Both binary and text streams are supported.
This commit is contained in:
Markus Triska
2020-05-22 17:21:50 +02:00
parent 9e9c3b6342
commit cbbed310c5
2 changed files with 14 additions and 1 deletions

View File

@@ -353,7 +353,7 @@ The modules that ship with Scryer Prolog are also called
* [`format`](src/prolog/lib/format.pl) * [`format`](src/prolog/lib/format.pl)
The nonterminal `format_//2` is used to describe formatted output, The nonterminal `format_//2` is used to describe formatted output,
arranging arguments according to a given format string. arranging arguments according to a given format string.
The predicates `format/2`, `portray_clause/1` and `listing/1` The predicates `format/[2,3]`, `portray_clause/1` and `listing/1`
provide formatted *impure* output. provide formatted *impure* output.
* [`assoc`](src/prolog/lib/assoc.pl) * [`assoc`](src/prolog/lib/assoc.pl)
providing `empty_assoc/1`, `get_assoc/3`, `put_assoc/4` etc. providing `empty_assoc/1`, `get_assoc/3`, `put_assoc/4` etc.

View File

@@ -49,6 +49,10 @@
The predicate format/2 is like format_//2, except that it outputs The predicate format/2 is like format_//2, except that it outputs
the text on the terminal instead of describing it declaratively. the text on the terminal instead of describing it declaratively.
format/3, used as format(Stream, FormatString, Arguments), outputs
the described string to the given Stream. If Stream is a binary
stream, then the code of each emitted character must be in 0..255.
If at all possible, format_//2 should be used, to stress pure parts If at all possible, format_//2 should be used, to stress pure parts
that enable easy testing etc. If necessary, you can emit the list Ls that enable easy testing etc. If necessary, you can emit the list Ls
with maplist(write, Ls). with maplist(write, Ls).
@@ -68,6 +72,7 @@
:- module(format, [format_//2, :- module(format, [format_//2,
format/2, format/2,
format/3,
portray_clause/1, portray_clause/1,
listing/1 listing/1
]). ]).
@@ -359,6 +364,14 @@ format(Fs, Args) :-
phrase(format_(Fs, Args), Cs), phrase(format_(Fs, Args), Cs),
maplist(write, Cs). maplist(write, Cs).
format(Stream, Fs, Args) :-
phrase(format_(Fs, Args), Cs),
( stream_property(Stream, type(binary)) ->
maplist(char_code, Cs, Bytes),
maplist(put_byte(Stream), Bytes)
; maplist(put_char(Stream), Cs)
).
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
?- phrase(cells("hello", [], 0, []), Cs). ?- phrase(cells("hello", [], 0, []), Cs).