[parenscript-devel] Why is there a WITH clause in my loop?

Nick Fitzgerald fitzgen at gmail.com
Sun Jan 30 00:37:34 UTC 2011


Not sure if you know this or not, but JavaScript doesn't have block scope
like C and others do: var statements get "hoisted" to the top of the current
function. The following two foos are pretty much equivalent:

function foo(obj) {
    for (var key in obj) {
        var x = [];
        doStuffWith(x);
    }
}

function foo(obj) {
    var x = undefined, key = undefined;
    for (key in obj) {
        x = [];
        doStuffWith(x);
    }
}

Hope I have helped out just a little :)

_Nick_



2011/1/28 Daniel Gackle <danielgackle at gmail.com>

> Specifically, I'm having a hard time seeing how this:
>
>   function blah(obj) {
>       for (var key in obj) {
>           with ({ x : null }) {
>               var x = [];
>               // do anything at all here...
>
> can ever be better than this:
>
>   function blah(obj) {
>       for (var key in obj) {
>           var x = [];
>           // do that thing here instead...
>
> What am I missing?
>
>
>
>
>
>
> 2011/1/28 Daniel Gackle <danielgackle at gmail.com>
>
> I'm running to this WITH clause in a number of places, but can't see
>> the (potential) bug you describe in any of them. Can you provide an
>> example of this bug (that necessitates the WITH)? I don't get it yet.
>>
>> Daniel
>>
>>
>> 2010/12/10 Vladimir Sedach <vsedach at gmail.com>
>>
>> The WITH clause is there to make sure that lambdas capture a fresh
>>> binding of loop-local variables per iteration (otherwise they'd all
>>> share the same binding which would get incremented on every loop
>>> iteration).
>>>
>>> I'm guessing the reason your code doesn't run across this bug is that
>>> the lambda that captures time gets called once per iteration and
>>> discarded.
>>>
>>> Vladimir
>>>
>>> 2010/12/7 Daniel Gackle <danielgackle at gmail.com>:
>>> > Here's a really strange one.
>>> > We have a form like the following. I've stripped it down for brevity,
>>> so it
>>> > looks weird:
>>> > (loop :for time :from time1 :below time2 :do
>>> >   (when (foo
>>> >          (λ ()
>>> >            (bar
>>> >             (λ () (blah)) time))
>>> >          time)
>>> >     (break)))
>>> > It used to generate this:
>>> > for (var time = time1; time < time2; time += 1) {
>>> >     if (foo(function () {
>>> >         return barr(function () {
>>> >             return blah();
>>> >         }, time);
>>> >     }, time)) {
>>> >         break;
>>> >     };
>>> > };
>>> > But now it generates this:
>>> > for (var time = time1; time < time2; time += 1) {
>>> >     with ({ time : time }) {
>>> >         if (foo(function () {
>>> >             return bar(function () {
>>> >                 return blah();
>>> >             }, time);
>>> >         }, time)) {
>>> >             break;
>>> >         };
>>> >     };
>>> > };
>>> > That is one weird WITH clause in there! No doubt it has something
>>> > to do with lexical scoping magic going on under the hood. But
>>> > I definitely don't want it in a performance-critical loop.
>>> > Daniel
>>> > _______________________________________________
>>> > parenscript-devel mailing list
>>> > parenscript-devel at common-lisp.net
>>> > http://common-lisp.net/cgi-bin/mailman/listinfo/parenscript-devel
>>> >
>>> >
>>>
>>> _______________________________________________
>>> parenscript-devel mailing list
>>> parenscript-devel at common-lisp.net
>>> http://common-lisp.net/cgi-bin/mailman/listinfo/parenscript-devel
>>>
>>
>>
>
> _______________________________________________
> parenscript-devel mailing list
> parenscript-devel at common-lisp.net
> http://common-lisp.net/cgi-bin/mailman/listinfo/parenscript-devel
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.common-lisp.net/pipermail/parenscript-devel/attachments/20110129/8eb6294e/attachment.html>


More information about the parenscript-devel mailing list