[parenscript-devel] "let over lambda" seems buggy

Canhua dreameration at gmail.com
Thu Oct 13 07:25:13 UTC 2011


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 <vseloved at 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 at 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 at 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 at 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 at common-lisp.net
>> >> http://lists.common-lisp.net/cgi-bin/mailman/listinfo/parenscript-devel
>> >
>> >
>> > _______________________________________________
>> > parenscript-devel mailing list
>> > parenscript-devel at common-lisp.net
>> > http://lists.common-lisp.net/cgi-bin/mailman/listinfo/parenscript-devel
>> >
>> >
>>
>> _______________________________________________
>> parenscript-devel mailing list
>> parenscript-devel at common-lisp.net
>> http://lists.common-lisp.net/cgi-bin/mailman/listinfo/parenscript-devel
>
>
> _______________________________________________
> parenscript-devel mailing list
> parenscript-devel at common-lisp.net
> http://lists.common-lisp.net/cgi-bin/mailman/listinfo/parenscript-devel
>
>




More information about the parenscript-devel mailing list