[R6RS] End of file object

Anton van Straaten anton at appsolutions.com
Wed Mar 29 21:25:59 EST 2006


Will wrote:
> Mike's cringing could be ameliorated by a slight extension
> to cond

I'm not sure that extending COND is the right solution, for two reasons:

1. The extension would have to come with a warning that it isn't safe 
for use with READ.

2. The extension can't be used in contexts other than COND.

A similar effect could be achieved with a procedure, which has the 
benefit of being composable and usable in other contexts, e.g.:

(define test-eof
   (lambda (x)
     (if (eof-object? x) #f x)))

While this is still not safe for use with READ, I find it more 
acceptable to document that restriction on a standalone procedure, than 
on a piece of syntax that's part of COND.

This would allow Mike to write the following:

(cond
   ((test-eof (read-char p))
    => (lambda (ch) ...)) ...)

...which is only a procedure call away from his preferred version:

(cond
   ((read-char p)
     => (lambda (ch) ...)) ...)

It also allows variations like this:

(case (test-eof (read-char p))
   ((#f) (raise "The End."))
   ...)

...and it works with anaphoric macros, too.

BTW, is there not an efficiency issue here, i.e. might it be easier for 
a compiler to optimize the case where read-char returns #f directly?

Anton



More information about the R6RS mailing list