[m-dev.] streams proposal (part 2)

Ian MacLarty maclarty at cs.mu.OZ.AU
Fri Feb 24 09:51:24 AEDT 2006


On 23 Feb 2006, at 23:35, Ralph Becket wrote:

> Ian MacLarty, Friday, 24 February 2006:
>> On Tue, Feb 21, 2006 at 05:48:29PM +1100, Julien Fischer wrote:
>>> :- typeclass stream.error(Error) where
>>> [
>>>     % Convert a stream error into a human-readable format.
>>>     % e.g. for use in error messages.
>>>     %
>>>     func error_message(Error) = string
>>> ].
>>>
>>
>> I don't think this is a particularly useful way to do errors.  In my 
>> opinion
>> it would be better to add an extra Error argument to the stream 
>> typeclass and
>> make Error functionally dependent on Stream.  That way you can do more
>> with a returned error than simply converting it to a string (since 
>> you'll
>> know its ground type).
>
> I agree: making the IO errors entirely opaque was probably a mistake.
> It could be handy to know whether a file write failed because the 
> stream
> was closed or the device was full or whatever.
>
>>>     % The root of the stream class hierarchy.
>>>     %
>>> :- typeclass stream(Stream, State)
>>>     <= (Stream -> State) where [
>>>
>>>     % A human readable name describing the stream.
>>>     %
>>>     pred name(Stream::in, stream.name::out, State::di, State::uo) is 
>>> det,
>>>
>>
>> I would prefer this to be
>>
>>     func name(Stream) = string,
>>
>> but for the moment it has to have the State, because io.input_stream 
>> needs to
>> read the I/O state to access the stream info database.
>
> That's odd: why wouldn't a stream carry its name?
>

It's just the way the current io streams have been implemented.
I don't see why we can't store the name with the stream itself and
not with the state.

>>> %
>>> % Putback streams
>>> %
>>>
>>> :- typeclass stream.putback(Stream, Unit, State)
>>>         <= stream.input(Stream, Unit, State) where [
>>>
>>>     pred unget(Stream::in, Unit::in, State::di, State::uo) is det
>>> ].
>>>
>>
>> How would unget work?  What happens if I get an 'a', but then unget a 
>> 'b'?
>
> I believe (I may be wrong) that in the C IO library you can do just 
> that!
>
>>> %
>>> % Seekable streams
>>> %
>>>
>>> :- type stream.whence
>>>     --->    set
>>>     ;       cur
>>>     ;       end.
>>
>> Should the set function symbol have an argument?
>
> No, these are relative positions.  They are always given with a 
> separate
> argument (e.g., "100 bytes from the start/current point/end of the
> stream").
>

Oh right.  I get it now.

> Well, you could store it in a global univ mutable, but
>
>

Store the stream?  But you need the unit type to
to determine the correct method to call.

I don't think it's such a big deal not having the
current input/output stream.  We could still have
the current input and output *file* streams.

Ian.

--------------------------------------------------------------------------
mercury-developers mailing list
Post messages to:       mercury-developers at cs.mu.oz.au
Administrative Queries: owner-mercury-developers at cs.mu.oz.au
Subscriptions:          mercury-developers-request at cs.mu.oz.au
--------------------------------------------------------------------------



More information about the developers mailing list