|
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)
|
> Scheme already has a 'finally' in dynamic-wind.
Yup :-) I realised my mistake at about 3am on Sunday...
However I still think (finally) does something *slightly* different to
what is done by (dynamic-wind): where (dynamic-wind) executes its
third thunk on *any* throw past it, I'd expect (finally) to be
triggered by only either normal return, or exception-throw. That is,
the finally-clause gets installed *as an exception-handler*, not a
general unwinder. Perhaps (apologies for the untested, lowlevel
macro):
(define-macro (finally final-exp body . rest)
(let ((exn (gensym))
(result (gensym)))
`(with-exception-handler
(lambda (,exn)
,final-exp
(raise ,exn)) ; note[1]
(lambda ()
(let ((,result (begin
,body
,@rest)))
,final-exp
,result)))))
[1] I'm assuming here (I hope I read the SRFI correctly?) that (raise)
within an exception-handler chains to the next enclosing handler.
> (define-syntax finally
> (syntax-rules ()
> ((finally final-exp body . rest)
> (dynamic-wind (lambda () #f)
> (lambda () body . rest)
> (lambda () final-exp)))))
If someone is using call/cc to implement coroutines, or microthreads,
or what-have-you, this means that this
coroutine/thread/dynamic-context will give up its lock on each context
switch. What I was after was relinquishment of the lock when code
either returned normally, or threw an exception...
> The bottom line is that 'finally' is already there but it doesn't
> help as much as you would like.
Well, mostly because it's dynamic-wind, and dynamic-wind doesn't make
any distinctions between various kinds of throw.
Tony