Readline read_history and write_history addition

Alexander Dunlap alexander.dunlap at gmail.com
Mon Jan 21 23:34:50 EST 2008


On Jan 21, 2008 10:27 AM, Judah Jacobson <judah.jacobson at gmail.com> wrote:
>
> > On Jan 19, 2008 11:09 AM, Judah Jacobson <judah.jacobson at gmail.com> wrote:
> > >
> > > On Jan 18, 2008 11:10 PM, Alexander Dunlap <alexander.dunlap at gmail.com> wrote:
> > > > Hello all,
> > > >
> > > > I'd like to propose the addition of read_history and write_history
> > > > bindings to the readline library. I believe I've followed the
> > > > instructions on the Haskell wiki appropriately and I've set up a
> > > > ticket (with a patch) at
> > > > http://hackage.haskell.org/trac/ghc/ticket/2053.
> > > >
> > > > Essentially, the patch adds simple bindings so that Haskell programs
> > > > can use Readline's read_history and write_history functions. This will
> > > > be useful for the implementation of
> > > > http://hackage.haskell.org/trac/ghc/ticket/2050 (add persistent
> > > > history to GHCi) and potentially other applications.
> > > >
> > > > Thanks for your time and consideration.
> > > >
> > > > Alex
> > >
> > > That patch looks good to me.  While we're at it, can we also add the
> > > following related functions, which are used to control the maximum
> > > size of the history file?  (They're also provided by editline.)
> > >
> > > void             clear_history(void);
> > > void             stifle_history(int);
> > > int              unstifle_history(void);
> > > int              history_is_stifled(void);
> > >
>
> One more suggestion, from Robert Dockins (author of the Shellac and
> Shellac-readline packages):
>
> > The only concern I have is that this patch doesn't seem to
> > be handling errors properly.  read_history and write_history should return
> > errno, but this binding has them returning ().  These functions do file
> > operations and therefore can fail; we want (be able) to know when that
> > happens.
>
> I think we should just throw an error if those functions return a
> nonzero value; for example, we already do that in the functions
> readInitFile and parseAndBind.
>
> Thanks,
> -Judah
>

I'm reluctant to use the throw an error solution because these
functions failing does not have to be the end of the world (or even
necessarily handled by the application). If the history file can't be
found, the user just doesn't get their history restored (in fact, this
may not even be a problem: if the user hasn't used the application
before, readHistory will fail silently on the first run and then work
fine after the history has been saved at the end of the first
session). Similarly, writing or appending to the history file is
generally not an essential task and can fail without terminating the
program. (I know there's catch, but I don't think the programmer even
has to worry about it that much.) I think that just returning a value
for success and a value for failure would be appropriate.

However, I'm not sure how we would implement it without using error.
The usual Haskell solution would be to use Maybe, but what would we
have Just of, since the functions don't return real values? Is Just ()
an accepted idiom? (I've never seen it, but I haven't seen all the
Haskell there is to see, either.)

Thanks.
Alex


More information about the Libraries mailing list