From: Kent M Pitman
Subject: Re: (terpri t)-*terminal-io* (format t)-*standard-output*
Date: 
Message-ID: <sfwn2ewbheo.fsf@world.std.com>
Barry Margolin <······@bbnplanet.com> writes:

> In article <··············@mute.eaglets.com>,
> Sam Steingold  <···@usa.net> wrote:
> >T in terpri and format/prin* mean different things
> ...
> >What is rationale behind this? 
> 
> Probably compatibility with Maclisp (it didn't actually have *terminal-io*
> and *standard-output*, but I think it had analogous streams) or Zetalisp.

Yes, this is right.

Maclisp Backward compatibility may seem silly now, but it was a "make
or break" issue for the community at the time, with a large investment
in existing tools.  When thinking about the reasonableness of this,
think about how you'd feel RIGHT NOW about an incompatible change
"fixing" things. :-)  The issue is not Maclisp per se, but a need to
stop the community at some point and say "pay a lot just to keep up".
No one ever wants to pay.

At the time, and still in retrospect, I think we should have had a
separate FORMAT-STRING function, and we should have left T and NIL
be undefined (left to the implementation).  That would have been easy
to support by careful package definitions and compatibility function
definitions for people who couldn't afford code rewrite.

The REAL problems are these:

 (1) *standard-output* and *terminal-io* are too long
     to name as often as they are needed.

 (2) output to strings is possible.

Problem (2) is what precludes making
 (FORMAT [stream] control-string ..args..)
a possibility.  But in my experience, (2) is so utterly rare that
we probably should have used string streams, as in:
 (with-output-to-string (str some-string)
   (format str "..." ...args..))
In order to "pay for" the ability to do
 (format "..." ..args..)
most of the time. That is, the default output stream could be 
*standard-output* but not have to be written.

Or one could take a lesson from C and offer three functions:
 FORMAT, FORMAT-STREAM, and FORMAT-STRING.
(Except FORMAT-STREAM could take strings in place of streams for those 
who like that kind of thing. :-)