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
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
Vladmir,
Thanks for the detailed response. I can see you are right. Now I am totally confused why I got the error a month ago in google chrome as I can not recreate it. I swear I tested my original example. I remember writing an function a and b and testing. On top of that, the original macro I wrote now seems to work within a let.
Anyway, this is the original macro for a "functional-pseudo-chain": (defpsmacro fpchain (object &rest chains) "generate a pseudo-chain of method calls of given object and return the object. for use of js prototypes that do not allow chaining like j-query." (ps-once-only (object) (append '(progn) (mapcar (lambda (x) `(chain ,object ,x)) chains) `(,object))))
I use this primarily for the html5 canvas context object which requires a lot of method calls in a row but does not allow chaining. Similar to ps:chain except for the fact it does not chain properties (fpchain foo bar (baz)) does not work.
thanks again,
andy peterson
On Thu, Nov 29, 2012 at 12:31 AM, Vladimir Sedach vsedach@gmail.com wrote:
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
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