[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: behaviour of ~& in format string



Stephen,

You raise a good point about the inability of FORMAT to determine, between 
invocations, that a new line has been started.

The reason that the reference implementation of FORMAT does not remember state 
about the last character between invocations is that [1] it is not the only 
function which side effects output, and [2] there is no _portable_ way to 
query a Scheme port to determine it's state history with respect to newlines.

Consider the following example:

(format "abc~%")
(display "x")
(format "~&def~&ghi~%")


A "stateful" format would be correct with your sample, but in the above case 
yield the (incorrect)

 abc
 xdef
 ghi

rather than the correct "unstateful" (current) srfi-48

 abc
 x
 def
 ghi

Given the amazing creativity w.r.t port implementations amoung various Scheme 
runtimes, I opted NOT to try and respecify/shadow/override all output as part 
of SRFI-48.  There are  just too many non-R^nRS output functions in use (in 
object ports, vector ports, fifo ports, graphic ports...).

Given this lack, I chose to be "wrong" in cases where state would be required 
to be "remembered" between invocations of FORMAT rather than the converse.

Note that this does accord with the Common Lisp definition for ~& :

  "Unless it can be determined that the output stream is already at 
   the beginning of a line, this outputs a newline".

Traditionally, this is implemented as a call to the function FRESH-LINE, where 
the text elucidates ["this" refers to being at the start of a line]:
  "(If for some reason this cannot be determined, then a newline is output   
  anyway)."

[Guy Steele, Jr, _Common LISP, The Language, Second Edition_, Digital Press, 
1990, pg 596, pg 579].

FRESH-LINE is implemented various Scheme dialects (e.g. MIT-Scheme, T) with 
the same definition.

The CL specification, and my implementation, are conservative but may result 
in a "spurious" newline--which IS allowed by the definition.

It is probably worthwhile mentioning this in the ISSUES section of SRFI-48.

I have been neglegent in this respect and shall update the text.

Thanks much for pointing this out.

-KenD

===========================================
On Saturday 02 July 2005 16:46, you wrote:
> Ken Dickey,
> I believe that '~&" should ensure that output begins on a new line. That
> is, output a newline character if (and only if) the output stream is *not*
> already at the start of a line. 
> ... 
> (format t "abc~%")
> (format t "~&def~&ghi~%")
...
>== I believe that the blank line between "abc" and "def" (which only occurs
> when I use srfi-48 under either Guile or Gauche) is spurious,
> Stephen Lewis