|
Finally clauses
Tony Garnock-Jones
(09 Aug 2002 14:05 UTC)
|
|
Re: Finally clauses
Dave Mason
(09 Aug 2002 14:58 UTC)
|
|
Re: Finally clauses Richard Kelsey (09 Aug 2002 23:28 UTC)
|
|
Re: Finally clauses
Tony Garnock-Jones
(12 Aug 2002 11:24 UTC)
|
|
Re: Finally clauses
Richard Kelsey
(13 Aug 2002 00:48 UTC)
|
|
Re: Finally clauses
Tony Garnock-Jones
(13 Aug 2002 17:35 UTC)
|
|
Re: Finally clauses
Richard Kelsey
(15 Aug 2002 01:47 UTC)
|
|
Re: Finally clauses
Tony Garnock-Jones
(15 Aug 2002 11:11 UTC)
|
|
Re: Finally clauses
bear
(15 Aug 2002 15:19 UTC)
|
|
Re: Finally clauses
sperber@xxxxxx
(29 Aug 2002 08:08 UTC)
|
|
Re: Finally clauses
bear
(01 Sep 2002 20:55 UTC)
|
|
Re: Finally clauses
Richard Kelsey
(01 Sep 2002 22:22 UTC)
|
|
Re: Finally clauses
bear
(04 Sep 2002 03:07 UTC)
|
|
Re: Finally clauses
Richard Kelsey
(04 Sep 2002 06:55 UTC)
|
Date: Fri, 9 Aug 2002 15:10:56 +0100
From: Tony Garnock-Jones <xxxxxx@eservglobal.com>
Hi. One feature I find valuable in Java that I miss in C++ (and
Scheme, for that matter) is the idea of a "finally" clause. Would
srfi-34 be a sensible place to put one of these - either alongside the
try clause, on its own, or bound up together with it, as perhaps
try/finally?
Scheme already has a 'finally' in dynamic-wind. In Java the
'finally' mechanism is combined with exception handling because
raising an exception is the only way to do a throw. Scheme has
long had throws, via call-with-current-continuation, and in
R5RS it got dynamic-wind as its version of 'finally'. What it
doesn't have is exceptions. With SRFI-34 exceptions and throws
are still separate. You can raise an exception without doing a
throw, and do a throw without raising an exception.
(begin
(mutex-lock! m)
(finally (mutex-unlock! m)
(do-operation-requiring-lock)))
This 'finally' can be defined as:
(define-syntax finally
(syntax-rules ()
((finally final-exp body . rest)
(dynamic-wind (lambda () #f)
(lambda () body . rest)
(lambda () final-exp)))))
Note that your example doesn't work well because someone can
use continuations to throw out of the lock-requiring operation
and then back in again. You could fix this by doing
(dynamic-wind (lambda () (mutex-lock! m))
(lambda () (do-operation-requiring-lock))
(lambda () (mutex-unlock! m)))
but your lock-requiring operation still only gets very weak
protection. The lock only protects the sections that do not do
throws, and you don't need 'finally' for those parts.
The bottom line is that 'finally' is already there but it doesn't
help as much as you would like.
-Richard Kelsey