From: Didier Remy <Didier.Remy@inria.fr>
To: "Yaron M. Minsky" <yminsky@cs.cornell.edu>
Cc: Caml List <caml-list@inria.fr>
Subject: Re: [Caml-list] unwind-protect
Date: Wed, 30 Jul 2003 19:29:05 +0200 [thread overview]
Message-ID: <20030730192905.A8578@morgon.inria.fr> (raw)
In-Reply-To: <1059561019.25904.1468.camel@dragonfly.localdomain>; from yminsky@cs.cornell.edu on Wed, Jul 30, 2003 at 06:30:19AM -0400
> One of the downsides of having people write their own unwind-protect's is
> that it's a tad tricky to get right. The trick is ensuring that the
> cleanup code only gets run once, even if an exception is thrown in the
> middle of the cleanup.
Yes, this is essential when the finalization code is a parameter.
You do not need to use side effects, though.
type 'a computation = Value of 'a | Exception of exn
let freeze_computation f x =
try Value (f x) with z -> Exception z
let unfreeze_computation = function
Value v -> v | Exception z -> raise z;;
let try_finalize f x g y =
let fx = freeze_computation f x in
let _ = g y in
unfreeze_computation fx
There is still a choice in the semantics regarding which exception to return
when both computations f x and g y fail. The above code reports the
exception of the finalization code. To report the exception of the
computation, replace
let _ = g y in
by
let _ = freeze_computation g y in
Didier
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
next prev parent reply other threads:[~2003-07-30 17:25 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-07-28 18:34 [Caml-list] assert caught by try with _ Chris Hecker
2003-07-28 19:08 ` Nicolas Cannasse
2003-07-29 2:37 ` Chris Hecker
2003-07-29 3:17 ` Jacques Garrigue
2003-07-29 21:01 ` Chris Hecker
2003-07-30 10:22 ` Yaron M. Minsky
2003-07-30 15:47 ` james woodyatt
2003-08-06 12:19 ` Michal Moskal
2003-08-06 14:50 ` William Lovas
2003-08-06 17:44 ` Michal Moskal
2003-07-30 5:44 ` Jason Hickey
2003-07-30 5:44 ` [Caml-list] unwind-protect Jason Hickey
2003-07-30 10:30 ` Yaron M. Minsky
2003-07-30 17:29 ` Didier Remy [this message]
2003-07-31 0:47 ` Jacques Garrigue
2003-07-30 14:44 ` William Lovas
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=20030730192905.A8578@morgon.inria.fr \
--to=didier.remy@inria.fr \
--cc=caml-list@inria.fr \
--cc=yminsky@cs.cornell.edu \
/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;
as well as URLs for NNTP newsgroup(s).