Andreas Rossberg wrote:
On 6 February 2012 16:28, Brendan Eich<bren...@mozilla.org>  wrote:
>  Andreas Rossberg wrote:
>>  Agreed. As long as we don't spec something weird, the extra effort for
>>  implementations shouldn't be much more than that of an extra block
>>  around the loop body.
>
>  To take Allen's best shot and re-fire it, what do you think should happen
>  here?
>
>    for (let i = 0, skip2 = function(){i++}; i<  N; i++) {
>      foo();
>      if (bar())
>        skip2();
>    }

Pretty much the same as in

   let i_ = 0, skip2_ = function(){i_++};
   for (; i_<  N; i_++) {
     let i = i_, skip2 = skip2_;
     foo();
     if (bar())
       skip2();
   }

Yes, this is something Jon Zeppieri brought up as a reason not to do fresh-binding-per-iteration in for(let;;) -- moving the initializer part out of the loop loses the binding-per-iteration.

You've shown b-p-i restored manually, with i_ vs. i renaming, but in the likely scenarios the user sees only one "i" variable.

Try this version:

  let i = 0, skip2_ = function(){i++};
  for (; i<  N; i++) {
    foo();
    if (bar())
      skip2();
  }


This must "work" (skip2 must advance the one i binding; note no closure capture here) just as it does today. Jon was arguing against a change in binding semantics simply due to moving the let into the for-head.

We who were in the TC39 meeting room late the second day have overcome Jon's good counter-argument. For the greater good on balance, many of us TC39ers want to make for(let;;) a special form, so closure capture works as most users expect.

You're right that the trade-off where skip2 fails to update any useful loop variable (or the first iteration's loop variable only -- agreed that is odd) follows from this greater-good choice. But could we do better?

Making dynamic errors out of skip2-like capture seems bad. We can't guarantee early errors. Probably best to avoid adding error cases...

Probably not what the programmer expected, but as others have said,
it's a trade-off. This use case seems rare,

Agreed on "rare".

  rather obfuscated style

This isn't so clear to me, since the case where the let is manually hoisteid from the for head does "work", and hackers who learned C or C++ may think that moving the let into the head is just better style, not obfuscatory.

IMHO, and you can easily work around it. So probably not something you
want to be optimizing the language semantics for.

I agree with you, but feel a small nagging doubt.

/be
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to