Re: with-open-file in clisp vs sbcl

Bruno Haible <[email protected]> Mon, 12 Nov 2018 00:49:46 +0100
Newsgroups gmane.lisp.clisp.devel
Message-ID <1626636.h5idC9LvXe@omega>
Sam asked:

> I discovered
> that `with-open-file' is implemented differently in CLISP and SBCL:
> 
> (LET ((A (OPEN "f")))
>   (DECLARE (SYSTEM::READ-ONLY A))
>   (UNWIND-PROTECT (MULTIPLE-VALUE-PROG1 (PROGN (PRINT 1 A)) (WHEN A (CLOSE A)))
>     (WHEN A (CLOSE A :ABORT T))))
> 
> vs
> 
> (LET ((A (OPEN "f")) (#:G368 T))
>   (UNWIND-PROTECT (MULTIPLE-VALUE-PROG1 (PROGN (PRINT 1 A)) (SETQ #:G368 NIL))
>     (WHEN A (CLOSE A :ABORT #:G368))))
> 
> The second version produces a marginally smaller bytecode (probably
> unimportant) and seems slightly more aesthetic (calls CLOSE only once).
> 
> Why did you choose the first version?

I did so for reliability. When the disk gets full, this produces an error
condition. Most often, the error condition will occur during the body that
produces output. But recall that a file-stream is most often buffered, and
that means that some output is still waiting in the buffer until the final
(CLOSE A) call; if the disk full error only occurs in this last file system
access,
  * the clisp variant will execute the protection clause (CLOSE A :ABORT T)
    and thus do as specified in ANSI CL [1]: "the file system is left, so far
    as possible, as if the file had never been opened."
  * the sbcl variant will not execute (CLOSE A :ABORT T) and thus leave a
    file on the (full) disk that is truncated.

WITH-OPEN-FILE was designed to avoid leaving truncated files on disk, and
an implementation should better achieve this goal in 100%, not 99%, of the
cases.

Bruno

[1] http://www.ai.mit.edu/projects/iiip/doc/CommonLISP/HyperSpec/Body/mac_with-open-file.html



_______________________________________________
clisp-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/clisp-devel