(rontolisp) docs
← Macros

with-output-to-string

(with-output-to-string (stream) body...)

Binds stream to a string output stream, evaluates the body forms, and returns everything written to the stream as a string. princ, prin1, print, terpri, fresh-line, write-line, write-char and write-string accept the stream as their optional stream argument, and format accepts it as the destination; each call appends to the stream. Works in all three backends.

Naming the bound variable *standard-output* redirects the whole stream-argument-less print family for the extent of the body -- including inside called functions, and including format with the t destination -- because those calls read the current (dynamically bound) value of *standard-output* at call time. The same redirect works for any let that binds *standard-output* to an output stream.

A nil stream argument means the same thing as an omitted one -- it is the *standard-output* designator, not "raw standard output". That is what makes the common Common Lisp shape of a renderer forwarding its own optional argument work under the redirect:

Binding *error-output* the same way captures the reports of warn instead; that variable's default is the process standard error, so an unredirected warning never lands on standard output.