Generally, the idea is to implement a runtime function called SIGNAL in Parenscript and use JS's try/catch to work with the stack.<div><br></div><div>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.</div>
<div><br></div><div>That's the general idea.  See <a href="https://github.com/gonzojive/paren-psos/blob/master/src/conditions-macrology.lisp">https://github.com/gonzojive/paren-psos/blob/master/src/conditions-macrology.lisp</a> and <a href="https://github.com/gonzojive/paren-psos/blob/master/src/paren/paren-conditions.paren">https://github.com/gonzojive/paren-psos/blob/master/src/paren/paren-conditions.paren</a></div>
<div><br></div><div>Since conditions rest upon the type system, this is integrated with PSOS, the Parenscript version of CLOS.<br><div><br></div><div>- Red<br><br><div class="gmail_quote">On Wed, Jun 8, 2011 at 1:51 AM, Daniel Gackle <span dir="ltr"><<a href="mailto:danielgackle@gmail.com">danielgackle@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">Red,<div><br></div><div>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 :)</div>


<div><br></div><font color="#888888"><div>Daniel</div></font><div><div></div><div class="h5"><div><br><br><div class="gmail_quote">On Tue, Jun 7, 2011 at 12:07 PM, Red Daly <span dir="ltr"><<a href="mailto:reddaly@gmail.com" target="_blank">reddaly@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

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<div>



<br></div><div>function foo() {</div><div>   try {<br>   var bar = function () {<br>       throw { 'ps-return-foo341' : 42 };<br>   };</div><div>    bar(); }<br>   catch (e) {</div><div>      if ('ps-return-foo341' in e)</div>



<div>         return e['ps-return-foo341'];</div><div>      else</div><div>           throw e;</div><div>};</div><div><br></div><div>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 <a href="https://github.com/gonzojive/paren-psos" target="_blank">https://github.com/gonzojive/paren-psos</a> and <a href="https://github.com/gonzojive/parenscript" target="_blank">https://github.com/gonzojive/parenscript</a></div>



<div><br></div><div>Viva Parenscript!</div><div><br></div><div><font color="#888888">Red</font><div><div></div><div><br><br><div class="gmail_quote">On Tue, Jun 7, 2011 at 11:40 PM,  <span dir="ltr"><<a href="mailto:sblist@me.com" target="_blank">sblist@me.com</a>></span> wrote:<br>



<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi,<br>
<br>
I was wondering if the BLOCK/RETURN-FROM feature in PS intends<br>
to support the following case:<br>
<br>
(ps (defun foo ()<br>
          (flet ((bar () (return-from foo 42)))<br>
            (bar))))<br>
<br>
=><br>
<br>
WARNING: Returning from unknown block FOO<br>
"function foo() {<br>
    var bar = function () {<br>
        return 42;<br>
    };<br>
    return bar();<br>
};"<br>
<br>
In order to try and get around the warning, I tried this:<br>
<br>
(ps (defun baz ()<br>
          (block foo<br>
            (flet ((bar () (return-from foo 42)))<br>
              (bar)))))<br>
<br>
=><br>
<br>
WARNING: Returning from unknown block FOO<br>
"function baz() {<br>
    var bar = function () {<br>
        return 42;<br>
    };<br>
    return bar();<br>
};"<br>
<br>
but that didn't seem to work. Any ideas on how to achieve lexical<br>
return here?<br>
<br>
        - Scott<br>
<br>
<br>
_______________________________________________<br>
parenscript-devel mailing list<br>
<a href="mailto:parenscript-devel@common-lisp.net" target="_blank">parenscript-devel@common-lisp.net</a><br>
<a href="http://lists.common-lisp.net/cgi-bin/mailman/listinfo/parenscript-devel" target="_blank">http://lists.common-lisp.net/cgi-bin/mailman/listinfo/parenscript-devel</a><br>
</blockquote></div><br></div></div></div>
<br>_______________________________________________<br>
parenscript-devel mailing list<br>
<a href="mailto:parenscript-devel@common-lisp.net" target="_blank">parenscript-devel@common-lisp.net</a><br>
<a href="http://lists.common-lisp.net/cgi-bin/mailman/listinfo/parenscript-devel" target="_blank">http://lists.common-lisp.net/cgi-bin/mailman/listinfo/parenscript-devel</a><br>
<br></blockquote></div><br></div>
</div></div><br>_______________________________________________<br>
parenscript-devel mailing list<br>
<a href="mailto:parenscript-devel@common-lisp.net">parenscript-devel@common-lisp.net</a><br>
<a href="http://lists.common-lisp.net/cgi-bin/mailman/listinfo/parenscript-devel" target="_blank">http://lists.common-lisp.net/cgi-bin/mailman/listinfo/parenscript-devel</a><br>
<br></blockquote></div><br></div></div>