From: Jon Harrop <jon@ffconsultancy.com>
To: caml-list@yquem.inria.fr
Subject: Re: [Caml-list] [OSR] OCaml Standard Recommandation Process
Date: Mon, 28 Jan 2008 20:49:08 +0000 [thread overview]
Message-ID: <200801282049.08477.jon@ffconsultancy.com> (raw)
In-Reply-To: <20080128.170610.265034237530039453.Christophe.Troestler+ocaml@umh.ac.be>
On Monday 28 January 2008 16:06:10 Christophe TROESTLER wrote:
> On Mon, 28 Jan 2008 15:25:12 +0000, Jon Harrop wrote:
> > So you write a "use" binding:
> >
> > let read_first_line file =
> > use ch = open_in file in
> > input_line ch
> >
> > and it gets translated into:
> >
> > let read_first_line file =
> > let ch = open_in file in
> > try input_line ch finally
> > ch#dispose
> >
> > where the "dispose" method that was automatically inserted at the end of
> > the scope of the "use" binding calls "close_in" in this case to
> > deallocate the external resource (a file handle in this case but it could
> > be anything with a dispose method).
>
> What is wrong with
>
> let read_first_line file =
> with_open_in file begin fun ch ->
> input_line ch
> end
Sure. Here's the complete version using combinators as a workaround:
# let try_finally x f g =
try
let f_x = f x in
g x;
f_x
with e ->
(try g x with _ -> ());
raise e;;
val try_finally : 'a -> ('a -> 'b) -> ('a -> unit) -> 'b = <fun>
# let with_open_in file k =
try_finally (open_in file) k close_in;;
val with_open_in : string -> (in_channel -> 'a) -> 'a = <fun>
# let read_first_line file =
with_open_in file begin fun ch ->
input_line ch
end;;
val read_first_line : string -> string = <fun>
This is almost exactly what I currently do.
The "use" binding is syntactic sugar to make it shorter, clearer, more generic
and scale better.
I'd be more than happy to have anything at all added to improve this though.
Combinators in the stdlib are certainly better than nothing and this is one
of the most complained about noob problems (and lack of functions to read
files)...
--
Dr Jon D Harrop, Flying Frog Consultancy Ltd.
http://www.ffconsultancy.com/products/?e
next prev parent reply other threads:[~2008-01-28 20:54 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-01-27 13:23 David Teller
2008-01-27 13:52 ` [Caml-list] " Paolo Donadeo
2008-01-27 14:24 ` Yaron Minsky
2008-01-27 19:07 ` David Teller
2008-01-27 21:07 ` Jon Harrop
2008-01-27 21:47 ` Yaron Minsky
2008-01-28 11:06 ` David Teller
2008-01-28 12:04 ` Jon Harrop
2008-01-28 12:31 ` David Teller
2008-01-28 14:23 ` Brian Hurt
2008-01-28 15:15 ` Loup Vaillant
2008-01-28 15:40 ` Brian Hurt
2008-01-28 19:46 ` Jon Harrop
2008-01-28 15:25 ` Jon Harrop
2008-01-28 16:06 ` Christophe TROESTLER
2008-01-28 16:20 ` Nicolas Pouillard
2008-01-28 16:45 ` Christophe TROESTLER
2008-01-28 16:51 ` Olivier Andrieu
2008-01-28 19:58 ` Jon Harrop
2008-01-29 7:51 ` Gordon Henriksen
2008-01-28 20:49 ` Jon Harrop [this message]
2008-01-28 22:05 ` Till Varoquaux
2008-01-28 23:10 ` Jon Harrop
2008-01-28 16:37 ` Brian Hurt
2008-01-28 17:30 ` David Teller
2008-01-28 20:43 ` Jon Harrop
2008-01-28 21:12 ` Gerd Stolpmann
2008-01-28 21:39 ` Jon Harrop
2008-01-29 16:49 ` Edgar Friendly
2008-01-30 8:52 ` Sylvain Le Gall
2008-01-30 10:02 ` [Caml-list] " Jon Harrop
2008-01-30 12:12 ` Vincent Hanquez
2008-01-28 21:43 ` [Caml-list] " Dario Teixeira
2008-01-29 7:59 ` Francois Pottier
2008-01-28 22:07 ` Arnaud Spiwack
2008-01-27 14:36 ` Michaël Grünewald
2008-01-27 15:10 ` Dario Teixeira
2008-01-28 13:38 ` Sylvain Le Gall
2008-01-28 13:52 ` [Caml-list] " David Teller
2008-01-28 0:23 ` [Caml-list] " Oliver Bandel
2008-01-30 9:43 ` Sylvain Le Gall
2008-01-30 20:25 ` [Caml-list] " blue storm
2008-01-30 20:49 ` Sylvain Le Gall
2008-01-30 20:54 ` [Caml-list] " Eric Cooper
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200801282049.08477.jon@ffconsultancy.com \
--to=jon@ffconsultancy.com \
--cc=caml-list@yquem.inria.fr \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox