[plt-scheme] mzscheme enters infinite loop when unable to write to stdout
On Jun 22, Matthew Flatt wrote:
> At Sun, 21 Jun 2009 12:08:05 +0100, "Paulo J. Matos" wrote:
> > On Sat, 2009-06-20 at 20:38 -0400, Andrew Wilcox wrote:
> > > mzscheme enters an infinite loop printing "error writing to stream
> > > port" at the REPL if it is unable to write to stdout. (the odd
> > > position of the ">" prompt in the output is due to redirecting stdout
> > > to a pipe).
> > >
> >
> > I confirm this issue also in latest 4.2.
>
> I'm not sure there's a good solution to this. (This is an old issue.)
>
> The problem is that the exception is coming from deep inside `write'. A
> REPL generally shouldn't not exit just because printing a result
> failed. It might be that something went wrong calling a custom write
> handler, or maybe there was a transient error on the output port, and
> so the programmer might want to try again.
>
> In this case, there are no custom write handlers involved, because the
> failure happens while printing a prompt (I think). It might make sense
> to have the REPL abort if printing a prompt somehow fails... but,
> again, the prompt-printing part of a REPL is controlled through the
> `current-prompt-read' parameter, and not all errors during the
> prompt-read handler should abort the REPL.
Would it be possible to somehow detect that the error is a write error
on the closed `current-output-port' at a lower level and have a
parameter that determines what to do in this case? Such a parameter
can be set while the repl prints the prompt, and also wrapped around
things like:
mz -e '(parameterize ([exit-on-closed-output #t])
(for ([i (in-naturals)]) (printf "~s\n" i)))' | head -5
--
((lambda (x) (x x)) (lambda (x) (x x))) Eli Barzilay:
http://www.barzilay.org/ Maze is Life!