[parenscript-devel] Missing 'break' in CASE

Vladimir Sedach vsedach at gmail.com
Sat Nov 6 22:33:07 UTC 2010


Fixed. Thanks for the bug report.

Vladimir

2010/11/4  <sblist at me.com>:
> Evaluating this gives an error ("The Parenscript form .. cannot be compiled into an
> expression"):
>
> PS> (ps (lambda ()
>                (if baz 7
>                    (progn
>                      (loop :repeat 100 :do (bar))
>                      42))))
>
> This wasn't an issue in the previous code, which would generate:
>
> "function () {
>    if (baz) {
>        return 7;
>    } else {
>        for (var _js1 = 0; _js1 < 100; _js1 += 1) {
>            bar();
>        };
>        return 42;
>    };
> };"
>
>        Scott
>
> On 2010-11-03, at 11:23 PM, Vladimir Sedach wrote:
>
>> This bug is fixed in the patch I just committed which changes the way
>> special operators work.
>>
>> In the process of changing the special operators and fixing this bug,
>> I came to the conclusion that there is actually no way to implement a
>> magic "expressionize" function for the compiler that will do the right
>> thing for all forms - the necessary transformations depend both on the
>> outer and inner special operators in different ways. I think it's
>> possible to avoid the complexity of having a product of all possible
>> cases for this, and even if it's not, the special operators can be
>> grouped into only a few common classes, so things are not that bad.
>>
>> Please check out the latest version of Parenscript and see if the new
>> code breaks anything.
>>
>> Vladimir
>>
>> 2010/10/1  <sblist at me.com>:
>>> It appears that some commit between ac408014 and b9dc8d1a (maybe
>>> 2f9fa1976a?) breaks the compilation of CASE forms in a function's tail
>>> position when some (but not all) branches in a body form contain a RETURN.
>>>
>>> PS> (ps (defun foo ()
>>>          (case x
>>>            ("bar" (if y (return t) nil))
>>>            ("baz" nil))))
>>> "function foo() {
>>>    switch (x) {
>>>    case 'bar':
>>>        if (y) {
>>>            return true;
>>>        };
>>>    //----------------- missing break; here
>>>    case 'baz':
>>>        return null;
>>>    };
>>> };"
>>>
>>> Scott
>>>
>>> _______________________________________________
>>> parenscript-devel mailing list
>>> parenscript-devel at common-lisp.net
>>> http://common-lisp.net/cgi-bin/mailman/listinfo/parenscript-devel
>>>
>>
>> _______________________________________________
>> parenscript-devel mailing list
>> parenscript-devel at common-lisp.net
>> http://common-lisp.net/cgi-bin/mailman/listinfo/parenscript-devel
>
>
> _______________________________________________
> 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