I think I agree that SRFI-48 format strings (effectively borrowed from
C) aren't the best fit for a lispy language. But there is a space they
serve very well - When combined with the argument position qualifiers,
they allow relatively easy translation of software - where you change
just the format strings, and none of the rest of the code.
As a variation of practice that people have had long experience with
in C, I don't think they're a serious problem. If the design were
abjectly broken, I/O in C would have more trouble and pain than it
has.
This may not be the best way to do it, but it's a useful library for
portability and translatability. I don't think it would be the right
thing to build directly into the runtime, because better libraries
for closely related tasks can exist. But it's still a useful library.