From cbbed310c51640f11ade3a61752f4682f5ae8572 Mon Sep 17 00:00:00 2001 From: Markus Triska Date: Fri, 22 May 2020 17:21:50 +0200 Subject: [PATCH] ADDED: format/3, writing formatted output to a stream Both binary and text streams are supported. --- README.md | 2 +- src/prolog/lib/format.pl | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 9ad29239..2a477a28 100644 --- a/README.md +++ b/README.md @@ -353,7 +353,7 @@ The modules that ship with Scryer Prolog are also called * [`format`](src/prolog/lib/format.pl) The nonterminal `format_//2` is used to describe formatted output, 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. * [`assoc`](src/prolog/lib/assoc.pl) providing `empty_assoc/1`, `get_assoc/3`, `put_assoc/4` etc. diff --git a/src/prolog/lib/format.pl b/src/prolog/lib/format.pl index 17ab0bfc..c0ef87c1 100644 --- a/src/prolog/lib/format.pl +++ b/src/prolog/lib/format.pl @@ -49,6 +49,10 @@ The predicate format/2 is like format_//2, except that it outputs 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 that enable easy testing etc. If necessary, you can emit the list Ls with maplist(write, Ls). @@ -68,6 +72,7 @@ :- module(format, [format_//2, format/2, + format/3, portray_clause/1, listing/1 ]). @@ -359,6 +364,14 @@ format(Fs, Args) :- phrase(format_(Fs, Args), 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). -- 2.54.0