PS seems to think that the variable named BLOCK is being captured by the irrelevant lambda and inserts a WITH binding.
PS> (ps (loop :for i :from 0 :below 5 :do (let ((block (elt blocks i))) (foo block) (lambda () nil))))
"for (var i = 0; i < 5; i += 1) { with ({ block : null }) { var block = blocks[i]; foo(block); function () { return null; }; }; };"
This doesn't happen if you take out the lambda:
PS> (ps (loop :for i :from 0 :below 5 :do (let ((block (elt blocks i))) (foo block))))
"for (var i = 0; i < 5; i += 1) { var block = blocks[i]; foo(block); };"
... or even if you rename BLOCK to B:
PS> (ps (loop :for i :from 0 :below 5 :do (let ((b (elt blocks i))) (foo b) (lambda () nil))))
"for (var i = 0; i < 5; i += 1) { var b = blocks[i]; foo(b); function () { return null; }; };"
I thought this might be because PS had compiled a different form where BLOCK was indeed captured by closure in a loop and was remembering this inappropriately. But that doesn't seem right because the problem is reproducible on a fresh restart of PS.
Daniel
This was a bug in the PS-JS intermediate representation package, which was using CL package symbols. I've pushed a fix. Thanks for the bug report!
Vladimir
On Wed, Apr 11, 2012 at 3:03 PM, Daniel Gackle danielgackle@gmail.com wrote:
PS seems to think that the variable named BLOCK is being captured by the irrelevant lambda and inserts a WITH binding.
PS> (ps (loop :for i :from 0 :below 5 :do (let ((block (elt blocks i))) (foo block) (lambda () nil))))
"for (var i = 0; i < 5; i += 1) { with ({ block : null }) { var block = blocks[i]; foo(block); function () { return null; }; }; };"
This doesn't happen if you take out the lambda:
PS> (ps (loop :for i :from 0 :below 5 :do (let ((block (elt blocks i))) (foo block))))
"for (var i = 0; i < 5; i += 1) { var block = blocks[i]; foo(block); };"
... or even if you rename BLOCK to B:
PS> (ps (loop :for i :from 0 :below 5 :do (let ((b (elt blocks i))) (foo b) (lambda () nil))))
"for (var i = 0; i < 5; i += 1) { var b = blocks[i]; foo(b); function () { return null; }; };"
I thought this might be because PS had compiled a different form where BLOCK was indeed captured by closure in a loop and was remembering this inappropriately. But that doesn't seem right because the problem is reproducible on a fresh restart of PS.
Daniel
parenscript-devel mailing list parenscript-devel@common-lisp.net http://lists.common-lisp.net/cgi-bin/mailman/listinfo/parenscript-devel
parenscript-devel@common-lisp.net