Generally, the idea is to implement a runtime function called SIGNAL in Parenscript and use JS's try/catch to work with the stack.
Remember that handler-bind handlers are executed before the stack is unwound in an exceptional situation, while handler-case handlers are executed when already unwound. SIGNAL checks the available handlers and restarts. If a handler is found that accepts the error SIGNAL returns whatever that handler wants to return. Otherwise it throws a particular type of object (one with a property named 'ps-signal-p). HANDLER-CASE expands into a try-catch block where the catch inspects anything thrown for a 'ps-signal-p property and treats only such thrown objects as signals to be intercepted.
That's the general idea. See https://github.com/gonzojive/paren-psos/blob/master/src/conditions-macrology... https://github.com/gonzojive/paren-psos/blob/master/src/paren/paren-conditio...
Since conditions rest upon the type system, this is integrated with PSOS, the Parenscript version of CLOS.
- Red
On Wed, Jun 8, 2011 at 1:51 AM, Daniel Gackle danielgackle@gmail.comwrote:
Red,
While we're sort of on the topic... I recall that Vladimir liked your implementation of conditions in PS quite a bit. If you have a minute, would you care to summarize the basic idea? Alternatively I could just not be lazy and go look at it :)
Daniel
On Tue, Jun 7, 2011 at 12:07 PM, Red Daly reddaly@gmail.com wrote:
At one point I had this implemented using try-catch unless Parenscript's compiler could prove (rather naively) that the return-from clause was always executed. I am usually way behind the official branch, and I'm not sure if my changes ever made it in, and if they did if this case is a bug. Anyway it would do something like
function foo() { try { var bar = function () { throw { 'ps-return-foo341' : 42 }; }; bar(); } catch (e) { if ('ps-return-foo341' in e) return e['ps-return-foo341']; else throw e; };
verbose, but it should always work. other try-catch tricks allow lisp-style conditions, which I detailed in a post in this list within the year. in case of group interest the relevant code is available at https://github.com/gonzojive/paren-psos and https://github.com/gonzojive/parenscript
Viva Parenscript!
Red
On Tue, Jun 7, 2011 at 11:40 PM, sblist@me.com wrote:
Hi,
I was wondering if the BLOCK/RETURN-FROM feature in PS intends to support the following case:
(ps (defun foo () (flet ((bar () (return-from foo 42))) (bar))))
=>
WARNING: Returning from unknown block FOO "function foo() { var bar = function () { return 42; }; return bar(); };"
In order to try and get around the warning, I tried this:
(ps (defun baz () (block foo (flet ((bar () (return-from foo 42))) (bar)))))
=>
WARNING: Returning from unknown block FOO "function baz() { var bar = function () { return 42; }; return bar(); };"
but that didn't seem to work. Any ideas on how to achieve lexical return here?
- Scott
parenscript-devel mailing list parenscript-devel@common-lisp.net http://lists.common-lisp.net/cgi-bin/mailman/listinfo/parenscript-devel
parenscript-devel mailing list parenscript-devel@common-lisp.net http://lists.common-lisp.net/cgi-bin/mailman/listinfo/parenscript-devel
parenscript-devel mailing list parenscript-devel@common-lisp.net http://lists.common-lisp.net/cgi-bin/mailman/listinfo/parenscript-devel