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.lisp and https://github.com/gonzojive/paren-psos/blob/master/src/paren/paren-conditions.paren

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.com> wrote:
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