[m-dev.] for discussion: stream library v2
Peter Ross
petdr at miscrit.be
Thu Sep 28 21:43:07 AEDT 2000
On Thu, Sep 28, 2000 at 02:09:36PM +1100, Tyson Dowd wrote:
> On 27-Sep-2000, Ralph Becket <rbeck at microsoft.com> wrote:
> > >From Peter Ross on 27/09/2000 13:56:17
> > > They are impure because they were designed to map gracefully onto the
> > > foreign function interface. If you so desire, you can implement you
> > > stream interface at a higher level, hopefully getting the best of both
> > > worlds.
> >
> > That still doesn't explain why they *have* to be impure or
> > even declared as such. Can you give me an example where it's
> > necessary to have impure low-level stream code that can't be
> > hidden behind a pure interface?
>
> Hmm... Perhaps Fergus is right in saying that it would be a good idea
> to leave out the lowlevel interface for now...
>
> highlevel.m provides a typeclass for people who want to write streams in
> Mercury. It's completely pure and you are encouraged to use it to write
> streams in Mercury. If you are not a library implementor you should
> stop reading now.
>
> END USER SECTION OF STREAMS INTERFACE.
>
> Ah, so you're a library implementor. You'll be aware that writing pure
> interfaces to everything in C is sometimes a pain in the arse.
>
> And you'll also know that if you use Mercury's impurity interface
> (allowing you to at least use all the functionality of Mercury while
> using impure code to make a pure interface), you end up using the same
> old techniques over and over again every time you implement di/uo stream
> pair interfaces. That's because C uses almost the same stream interface
> every single time, and we use the same stream interface every single
> time. Good computer scientists don't repeat the same thing over and
> over again, they generalize it.
>
> lowlevel.m provides a typeclass for people who want to map the streams
> to a foreign language binding while doing the minimum of work. In
> particular you need to write much less foreign language code, since you
> only need to implement a few impure predicates with a well defined
> interface -- (well it's not *really* well defined yet but it will be).
>
> Lowlevel provides throwing exceptions, grabbing error messages, results
> packaged into ok/error/eof, and turning C style handle based IO into
> Mercury di/uo. That's all it does. But it's something you'll have to
> do and get right every time you implement a stream.
>
> There is absolutely *nothing less pure* about doing things this way.
> The C code is still underneath any interface you might write that
> targets the highlevel typeclass. But you have to write all the
> scaffolding yourself. The "new stream" stuff in the current IO library
> does almost exactly this stuff but a lot more is in C!
>
> - There is a table of function pointers, which are called from pragma C
> code (typeclasses, anyone?).
> - The pragma C code provides the di/uo moded stream (and so we have to
> implement half of the IO data structures in C -- e.g. line numbers and
> stream names).
> - We grab system error messages using C and a di/uo pair.
> - pure Mercury built on top of that C code provides ok/error/eof and
> exception throwing.
>
This is exactly the point I have been trying to make, thanks Tys.
>
> Fergus suggests that we could do the di/uo pairing in C, and lowlevel
> could provide an interface that just does ok/error/eof and exception
> throwing (e.g. much like what we have in the current IO library).
>
> IMHO is a reasonable suggestion -- an interface at that level might be
> useful too. Given that we don't have `ui' mode support at the moment,
> this might be the right thing to do for now. I like the idea of using
> typeclasses to automatically implement patterns for turning impure code
> into pure code, but I think in this case the pattern is sufficiently
> simple that it won't necessarily hurt us to do it by hand.
> So how about if lowlevel is a pure interface that does everything
> lowlevel currently does *except* it already expects di/uo stream pairs.
>
As pointed out in an email, I am not sure that using a di/uo pair
actually makes that much difference (apart from more typing for me) so I
am not sure if it is worth the effort.
> If we were to have a typeclass for turning impure C streams into Mercury
> di/uo streams, it would be better to name it "impure_c_stream" or
> something like that.
>
I don't like the names I have chosen, perhaps highlevel should become
stream and lowlevel impure_c_stream
Pete
--------------------------------------------------------------------------
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