Mike Sperber wrote:
> Sebastian Egner <xxxxxx@philips.com> writes:
> >> - The procedures for opening files for output now accept a
> >>   file-options argument.
> >
> > Sorry to keep bothing you with that, but I noticed two potential problems
> > with the
> > way this was solved in the SRFI:
> >
> > 1. File options do not have to have an external representation.
>
> Right.  Why do they need one?
>

> > Can I retrieve the file-options used for opening a particular
> > reader/writer/... from the reader/writer/... object?
>
> No, the file options are specific to files.  Can you argue why this
> would be important?  (For example, C API doesn't have this ability
> either, as far as I can tell.)

Both issues (external repr. and retrieving the file-options from a file) are related to
the same thing, so I discuss them together.

In the Mathematica programming language you can open a file for adding stuff
using the OpenAppend operation. This operation has a number of options,
with defaults, each of which can be overwritten using Mathematica rules. In
Mathematica, that is the mechanism to pass options---it works very well;
a lot to type, but I never made a mistake and the defaults work well.

The options of OpenAppend are described here:

        http://documents.wolfram.com/v4/RefGuide/OpenAppend.html

As you see, the options convey information that is being used to format
the output sent to the file. Other options would be more related to the operating
system, i.e. file permissions, but these are not part of Mathematica.

Now I have the feeling (it's not much more than that right now) that the day
may come where the options should be externalized and internalized again.
As a hypothetical example, think of a SRFI defining the following thing for
distributed execution:

        (WITH-REMOTE-PROCEDURE-CALL server thunk)

which connects via some RPC-based middleware thingy to /server/ and
then executes /thunk/. The idea is that all I/O commands, including opening
files, are executed on the server. This will be great if (and only if) the I/O API
can be used without knowing what it is, i.e. if the client and the server can
run different operating systems, Schemes systems etc. but still know enough
about each other to do meaningful things.

In practice this will only be possible if a number of things fit together:
1. The entire negotiation between language and OS can be represented
in a data structure.
2. The data structure can be sent losslessly through a WRITE/READ channel.
3. The default behavior makes sense in all cases that do not require special
treatment anyhow (e.g. if you need a pipe, you better have an OS that has them).
4. There is a way to reconstruct the negotiation later from the object itself,
i.e. you can get the options back from the file.

The last point might not really be essential, but I have seen great programs
to find out if a file descriptor in C is connected to file or a ptty because in one
case you might to do this, while in the other you might do that. Of course, this
information could be passed from the guy who made the file descriptor to
the guy who uses it on a side-channel, but in UNIX that is not what happens;
you poke around with fcntl/ioctls until you can guess it.

What I have sketched here is an extremely strong form of portability,
and I am not sure the world is ready for that. I am also not sure the plan
can really be executed. Also, I admit that it has no precedent in the civilized
world---you should be happy if the language gives you a reasonable way
of opening a file /locally/, like Ruby, Python, ... (missing something?)

> > Apart from that I noticed that the /file-options/ argument is
> > mandatory. Is that really the intention? Shouldn't it be optional,
> > with the obligation for the implementation to provide a reasonable
> > default behavior?
>
> The problem is that there's no obvious reasonable default, evidenced
> by the fact that different Scheme implementations use different
> defaults for OPEN-OUTPUT-FILE.

So that's what DEFAULT-FILE-OPTIONS could be for.