A library of procedures for formatting Scheme objects to text in various ways, and for easily concatenating, composing and extending these formatters.
displayis not acceptable, since it doesn't scale to very large output. The simplest realistic idea, and what people resort to in typical portable Scheme, is to interleave
writeand manual loops, but this is both extremely verbose and doesn't compose well. A simple concept such as padding space can't be achieved directly without somehow capturing intermediate output. The traditional approach is to use templates - typically strings, though in theory any object could be used and indeed Emacs' mode-line format templates allow arbitrary sexps. Templates can use either escape sequences (as in C's
format) or pattern matching (as in Visual Basic's
form, and SQL date formats). The primary disadvantage of templates is the relative difficulty (usually impossibility) of extending them, their opaqueness, and the unreadability that arises with complex formats. Templates are not without their advantages, but they are already addressed by other libraries such as SRFI-28 and SRFI-48. This library takes a combinator approach. Formats are nested chains of closures, which are called to produce their output as needed. The primary goal of this library is to have, first and foremost, a maximally expressive and extensible formatting library. The next most important goal is scalability - to be able to handle arbitrarily large output and not build intermediate results except where necessary. The third goal is brevity and ease of use.
format, the first argument is either an output port or a boolean, with
#findicating a string port. The remaining arguments are formatters, combined as with
each, run with output to the given destination. If
#fthen the accumulated output is returned, otherwise the result is unspecified.
ls, uppercasing all generated text.
ls, lowercasing all generated text.
(each-in-list ls)to at least
widthcharacters, equally applied to the left and right, with any extra odd padding applied to the right. Uses the value of
pad-charfor padding, defaulting to
padded/bothbut only applies padding on the right.
padded/bothbut only applies padding on the left.
(each-in-list ls)to at most
widthcharacters, removed from the right. If any characters are removed, then the value of
ellipsis(default empty) is used in its place (trimming additional characters as needed to be sure the final output doesn't exceed
trimmedbut removes from the left.
trimmedbut removes equally from both the left and the right, removing extra odd characters from the right, and inserting
ellipsison both sides.
trimmed, but truncates and terminates immediately if more than
widthcharacters are generated by
lsmay lazily generate an infinite amount of output safely (e.g.
write-simpleon an infinite list). The nature of this procedure means only truncating on the right is meaningful.
(each-in-list ls)to exactly
widthcharacters, padding or trimming on the right as needed.An alias for
fittedbut pads/trims from the left.
fittedbut pads/trims equally from both the left and the right.
elt-fto each element of the list
sep, which defaults to the empty string.
joinedbut treats the separator as a prefix, inserting before every element instead of between.
joinedbut treats the separator as a suffix, inserting after every element instead of between.
last-f, instead of
elt-f, to the last element of
ls, useful for e.g. commas separating a list with "and" before the final element.
lsis a dotted list applies
dot-fto the dotted tail as a final element.