Thank you for your suggestion. I should work. And I may also use a variable name for "x" that isn't possible to conflict (use gensym). So, yes, there are ways to work around this issue. But I learnt that "let over lambda" in parenscript is different from that in common lisp. Is that right?
The reason why I want need this is that I have to pass the whole object as argument to a library function. Many js libraries seem like to use object as configuration argument. On Thu, Oct 13, 2011 at 3:13 PM, Vsevolod Dyomkin <[email protected]> wrote: > I suggest, that you first consider, how would you do that in JS. You'll need > to wrap that in functions: > { > 'fn_1' : (function () { > var x = 1; > return function () { return x; } }) (), > 'fn_2' : (function () { > var x = 2; > return function () { return x; } }) () > } > Now let's think, how this can be done in Parenscript?.. > PS. But the most important question is: why do you need to create a single > function, that closes over a "private" variable, as part of an object? Isn't > it equivalent to just coding the value of the variable inside the function? > vsevolod > > > On Thu, Oct 13, 2011 at 10:05 AM, Canhua <[email protected]> wrote: >> >> actually what I want to achieve is something like this: >> (create "fn_1" (let ((x)) >> #'(lambda () >> x)) >> "fn_2" (let ((x)) >> #'(lambda () >> x))) >> and I expected these two "x" are lexical-scope separate and so >> independent from each other. >> However the compiled js code doesn't work as I expected. >> >> >> On Thu, Oct 13, 2011 at 2:51 PM, Vsevolod Dyomkin <[email protected]> >> wrote: >> > Hi >> > Actually the above code is correct. >> > You can also use: >> > - either >> > (let (x) >> > (create "fn" (lambda () x))) >> > - or >> > (create "x" nil >> > "fn" (lambda () x))) >> > depending on the JS semantics you want to get. >> > vsevolod >> > >> > >> > On Thu, Oct 13, 2011 at 8:40 AM, Canhua <[email protected]> wrote: >> >> >> >> hi, all, I found that >> >> (create "fn" (let ((x)) >> >> (lambda () x))) >> >> >> >> compiles to >> >> { 'fn' : (x = null, function () { >> >> return x; >> >> }) } >> >> >> >> wherein the variable x may conflict with a variable with the same name >> >> outside this code. >> >> How may avoid this? How may I achieve "let over lambda" closure effect >> >> as in common lisp? >> >> >> >> Thanks. >> >> >> >> _______________________________________________ >> >> parenscript-devel mailing list >> >> [email protected] >> >> http://lists.common-lisp.net/cgi-bin/mailman/listinfo/parenscript-devel >> > >> > >> > _______________________________________________ >> > parenscript-devel mailing list >> > [email protected] >> > http://lists.common-lisp.net/cgi-bin/mailman/listinfo/parenscript-devel >> > >> > >> >> _______________________________________________ >> parenscript-devel mailing list >> [email protected] >> http://lists.common-lisp.net/cgi-bin/mailman/listinfo/parenscript-devel > > > _______________________________________________ > parenscript-devel mailing list > [email protected] > http://lists.common-lisp.net/cgi-bin/mailman/listinfo/parenscript-devel > > _______________________________________________ parenscript-devel mailing list [email protected] http://lists.common-lisp.net/cgi-bin/mailman/listinfo/parenscript-devel
