[parenscript-devel] Patch: added JS label/break to PS

Vladimir Sedach vsedach at gmail.com
Fri Apr 9 22:42:56 UTC 2010

Makes sense to me. I'll add this to my todo list (which I'll publish
in an email as soon as I'm done my current work on the PS compiler).


2010/4/9 Daniel Gackle <danielgackle at gmail.com>:
> I just pushed a patch (authored by Scott) to implement JS's LABEL and BREAK
> in PS. (Note that this patch deprecates LABELED-FOR since you can get the
> same effect by combining LABEL and FOR. Was anybody using LABELED-FOR?)
> Here's an example:
> (label scope
>     (foo)
>     (when (bar)
>       (break scope))
>     (blee))
> =>
> scope: {
>     foo();
>     if (bar()) {
>         break scope;
>     };
>     blee();
> };
> I was astonished to discover recently that JS has supported this ability all
> along in the form of labeled statements and labeled breaks. I'd always
> assumed that to get explicit returns from an arbitrary scope, you'd have to
> resort to the ugly hack of muscling TRY/CATCH to do it, thinking that this
> was the closest JS counterpart.
> (See http://news.ycombinator.com/item?id=793092 for a thread in which
> several people believe this.) But it appears we were all wrong.
> What's not clear yet is how far this can be taken. Can you use it inside a
> nested local function to return immediately from the top-level function?
> That is one thing I've wanted for a long time.
> In the ideal case, LABEL/BREAK could be used as a base for implementing a
> proper BLOCK and RETURN-FROM in PS, something which we'd long believed to be
> impossible. One challenge is that in CL, RETURN-FROM can take a value, which
> becomes the value of BLOCK. In other words, BLOCK in CL is an expression
> while LABEL in JS is not. It seems, though, that most of this challenge has
> already been conquered with the development of implicit return in PS. The
> only thing you'd need to add is detecting when BLOCK is being used as an
> expression, declaring a gensymed variable and assigning whatever is
> happening inside BLOCK to that variable (much like implicit return already
> does with e.g. CASE), then put the variable in the expression position that
> BLOCK was in. It seems like this ought to work. It would also make things
> like this possible in PS:
> (1+ (case foo
>         (:eleven 11)
>         (:twelve 12)))
> Vladimir (and everybody), is the above clear? What do you think of it?
> Daniel
> _______________________________________________
> parenscript-devel mailing list
> parenscript-devel at common-lisp.net
> http://common-lisp.net/cgi-bin/mailman/listinfo/parenscript-devel

More information about the parenscript-devel mailing list