Believe it or not, that's actually valid JavaScript code:
PS> (ps (let ((x (let ((y 12)) (+ 1 2) y))) (1+ x))) "(function () { var y; var x = (y = 12, (1 + 2, y)); return x + 1; })();" PS> (cl-js:run-js *) 13
In your example, a() and b() were expressions, so the inner let generated a sequence of expressions by using the comma operator. If for example you replace b() by a statement:
PS> (ps (let ((x (let ((y 12)) (dolist (x '(1 2 3)) (* x x)) y))) (1+ x))) "(function () { var y; var x4 = (y = 12, ((function () { for (var x = null, _js_arrvar6 = [1, 2, 3], _js_idx5 = 0; _js_idx5 < _js_arrvar6.length; _js_idx5 += 1) { x = _js_arrvar6[_js_idx5]; x * x; }; })(), y)); return x4 + 1; })();" PS> (cl-js:run-js *) 13
This is ugly, and I would love examples of how to generate better code for nested LETs.
Happy hacking, Vladimir
On Wed, Oct 24, 2012 at 5:50 AM, Andy Peterson andy.arvid@gmail.com wrote:
If you use a let within the init-form of an outer let, the result is invalid javascript code.
Here is a simplified example:
(ps (let ((x (let ((y (a))) (b) y))) (1+ x)))
==>
"(function () { var y; var x = (y = a(), (b(), y)); return x + 1; })();"
Not that I would normally write such code, but the inner "let" was generated by a macro. And many macros use "let" with gensyms. In my case, the macro used "ps-once-only".
Andy Peterson
parenscript-devel mailing list parenscript-devel@common-lisp.net http://lists.common-lisp.net/cgi-bin/mailman/listinfo/parenscript-devel