Run Goal as once/1, 
while characters written to the current output are sent to Output. 
The predicate is SWI-Prolog-specific, inspired by various posts to the 
mailinglist. It provides a flexible replacement for predicates such as 
sformat/3 , swritef/3,
term_to_atom/2, atom_number/2 
converting numbers to atoms, etc. The predicate format/3 
accepts the same terms as output argument.
For capturing other streams, see with_output_to/3.
Applications should generally avoid creating atoms by breaking and 
concatenating other atoms, as the creation of large numbers of 
intermediate atoms generally leads to poor performance, even more so in 
multithreaded applications. This predicate supports creating difference 
lists from character data efficiently. The example below defines the DCG 
rule term//1 to insert a term in the output:
term(Term, In, Tail) :-
        with_output_to(codes(In, Tail), write(Term)).
?- phrase(term(hello), X).
X = [104, 101, 108, 108, 111]
Output takes one of the shapes below. Except for the 
first, the system creates a temporary stream using the wchar_t 
internal encoding that points at a memory buffer. The encoding cannot be 
changed and an attempt to call set_stream/2 
using encoding(Encoding) results in a permission_error 
exception.
- A Stream handle or alias
- Temporarily switch current output to the given stream. Redirection using
with_output_to/2 
guarantees the original output is restored, also if
Goal fails or raises an exception. See also call_cleanup/2.
- atom(-Atom)
- Create an atom from the emitted characters. Please note the remark 
above.
- string(-String)
- Create a string object as defined in section 
5.2.
- codes(-Codes)
- Create a list of character codes from the emitted characters, similar to
atom_codes/2.
- codes(-Codes, -Tail)
- Create a list of character codes as a difference list.
- chars(-Chars)
- Create a list of one-character atoms from the emitted characters, 
similar to atom_chars/2.
- chars(-Chars, -Tail)
- Create a list of one-character atoms as a difference list.