[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Scheme-reports] 6.1 Exceptions needs examples
The following message is a courtesy copy of an article
that has been posted to gmane.lisp.scheme.reports as well.
* John Cowan [2012-03-21 03:28] writes:
> Per Bothner scripsit:
>> In an implementation like Kawa without full call/cc support
>> it should still be possible to support "normal" non-continuable
>> exception handling, hopefully in a way that makes use of and
>> integrates with native JVM exceptions.
> I've been thinking about this off and on for some time. Here are my
> current ideas.
> First, a `parameterize` expression has to compile to a try-finally so that
> when the thunk terminates, the parameter will be reset.
> A hidden stack (Java or Scheme, doesn't matter) needs to exist which
> holds the handlers. A `with-exception-handler` call pushes the handler
> itself on the stack, whereas a `guard` expression just pushes a marker
> of some sort. Again, a try-finally is needed to clean up the stack as
> control exits through it.
> On a call to either `raise` or `raise-continuable` the stack is popped.
> If it's a procedure object, apply it to the condition object passed.
> If that returns, either re-raise or return to the caller as the case
> may be. But if the object on the stack was a marker, wrap the condition
> object in a Java RuntimeException and throw it. A `guard` expression is
> compiled into a try-catch structure, so it will intercept it. Likewise,
> `with-exception-handler` catches any RuntimeException and invokes the
> thunk on it.
> I hope this makes sense.
What should this example return
(let ((events '()))
(lambda () (set! events (cons 'c events)))
(lambda () #f)
(lambda () (set! events (cons 'd events))))
(lambda () (set! events (cons 'a events)))
(lambda () (raise 'error))
(lambda () (set! events (cons 'b events))))))
Is it '(a b c d a b) or '(a c d b) or '(a b c d) or unspecified?
Scheme-reports mailing list