On Thu, Oct 13, 2011 at 10:25 AM, Canhua <dreameration@gmail.com> 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 <vseloved@gmail.com> 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 <dreameration@gmail.com> 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 <vseloved@gmail.com>
>> 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 <dreameration@gmail.com> 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
>> >> 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 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 mailing list
parenscript-devel@common-lisp.net
http://lists.common-lisp.net/cgi-bin/mailman/listinfo/parenscript-devel