<br><br><div class="gmail_quote">On Thu, Jun 30, 2011 at 4:07 PM, Brendan Eich <span dir="ltr"><<a href="mailto:brendan@mozilla.com">brendan@mozilla.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class="im">On Jun 30, 2011, at 3:33 PM, Vladimir Sedach wrote:<br>
<br>
> Hello,<br>
><br>
> I was recently pointed to the block scoping and TCP discussions by<br>
> Peter Michaux, and have a question as to how this will affect the<br>
> capture of loop-local variables by closures created in loops.<br>
<br>
</div>A well-known sore point.<br>
<br>
The good news is that for-in and for-of loops in ES.next, when using let (or if implicitly using let, in comprehensions, generator expressions, and possibly even the for-of loop statmeent) not var, will result in a fresh binding per iteration:<br>

<br>
<a href="http://wiki.ecmascript.org/doku.php?id=harmony:iterators" target="_blank">http://wiki.ecmascript.org/doku.php?id=harmony:iterators</a><br>
<div class="im"><br>
<br>
> Some programming languages (Common Lisp in particular) assign a new<br>
> binding to loop-local variables on every iteration. JS doesn't do<br>
> this, but there is a way to introduce a new lexical environment on<br>
> every iteration with the WITH statement, an idea that I first<br>
> encountered in the Scheme2JS compiler<br>
> (<a href="http://www-sop.inria.fr/indes/scheme2js/" target="_blank">http://www-sop.inria.fr/indes/scheme2js/</a>). Parenscript uses this<br>
> trick for translating Common Lisp to JS (a good discussion of how this<br>
> shows up in loops is here:<br>
> <a href="http://lists.common-lisp.net/pipermail/parenscript-devel/2010-December/000914.html" target="_blank">http://lists.common-lisp.net/pipermail/parenscript-devel/2010-December/000914.html</a>).<br>
><br>
> However the WITH statement is deprecated. How can per-iteration<br>
> loop-local variable capture be accomplished with the current proposal,<br>
> and what effect does the Block Lambda Revival proposal have on this<br>
> issue?<br>
<br>
</div>See above. 'with' is not lexical in any sense, and it has been removed from ES5 strict mode, so it is gone from Harmony / ES.next.<br>
<br>
'let', on the other hand, is the new var, and we have the opportunity to make a fresh binding per iteration when for-in/-of is used with 'let'. This is the way to go.<br>
<br>
The old C-style for(;;) loop is a hard case. It really does want a single shared-mutable loop control variable. Making 'let' instead of var in for (let i = 0; i < N; i++) ... bind afresh on each iteration and communicate the ++ update across the loop edge is theoretically doable, but it's wrong.</blockquote>
<div><br></div><div>Why is it wrong? I showed a de-sugaring of for(;;) into lambda that creates a separate binding per iteration. (I can try to find it in the es-discuss archive if it would be helpful.)</div><div><br></div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"> There's really only one binding there.<br>
<br>
So for-in/-of will benefit with 'let'. Is that enough? If not, you can always nest an explicit block inside the loop and capture its 'let' bindings.<br>
<font color="#888888"><br>
/be<br>
</font><div><div></div><div class="h5"><br>
_______________________________________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br>    Cheers,<br>    --MarkM<br>