On Thu, Oct 13, 2011 at 10:25 AM, Canhua <[email protected]> wrote:
> 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? > Yes, because Parenscript's target is JavaScript the semantics of many operations is different from Common Lisp's. > 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. > In this case you probably don't need a closure as object's "member" function. vsevolod > > 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 >
_______________________________________________ parenscript-devel mailing list [email protected] http://lists.common-lisp.net/cgi-bin/mailman/listinfo/parenscript-devel
