I am playing with a lisp dialect (at least in my head) that I am thinking about implementing on the CLR. Like Java the CLR requires jumps across method call boundaries to be done using the exception handling mechanism.
If I have code like the following in abcl:
(block foo (flet ((callback () (return-from foo t))) (something-that-calls-into-java #'callback) ... stuff that won't happen if the callback is invoked))
And the plain old Java I'm calling into is pathological and catches the exception raised by calling the callback without re-throwing it, the non-local return never happens. Is that correct?
If so, is there no way around it?
Matt
Hi Matthew,
On Thu, Oct 15, 2009 at 7:46 AM, Matthew D. Swank akopa@charter.net wrote:
I am playing with a lisp dialect (at least in my head) that I am thinking about implementing on the CLR. Like Java the CLR requires jumps across method call boundaries to be done using the exception handling mechanism.
If I have code like the following in abcl:
(block foo (flet ((callback () (return-from foo t))) (something-that-calls-into-java #'callback) ... stuff that won't happen if the callback is invoked))
And the plain old Java I'm calling into is pathological and catches the exception raised by calling the callback without re-throwing it, the non-local return never happens. Is that correct?
That's correct.
If so, is there no way around it?
Well, given that the work around would have a performance impact, I wouldn't like to make it a generic one, but you could do this:
(block foo (let (boo) (flet ((callback () (setf boo t) (return-from foo t))) (something that calls into java #'callback) (when boo (return-from foo t)) ...))
I.O.W.: You can set a variable to be checked after you return from Java.
Hope that helps,
Erik.
armedbear-devel@common-lisp.net