return when desugaring to closures

Jon Zeppieri jaz at bu.edu
Mon Oct 13 16:14:21 PDT 2008


On Mon, Oct 13, 2008 at 6:34 PM, Brendan Eich <brendan at mozilla.com> wrote:
>
> On the contrary, what's magical is when one stores i in elements of an
> array, or calls setTimeout (example in https://bugzilla.mozilla.org/show_bug.cgi?id=449811)
> , and the results are all the last value of the loop variable.
>
> This has been a frequent source of confusion and complaints -- a bug,
> in short.

Yes, and binding a fresh induction variable on every iteration makes
sense for a 'for-each' loop (as in the bug report you cited), where
the user is not in charge of updating the induction variable by means
of explicit assignment.  In a plain 'for' loop, however, it *is* magic
if an assignment results in a fresh binding.  And it's unexpected
magic.

Mark said that there was a desugaring for 'for' to 'lambda,' without
special cases, where this all works out, but I haven't been able to
figure out what rewrite he had in mind.

>
> Doing it the way Mark proposes fixes the bug, and has no other bad
> effects that I can see (but we'll have to implement and user-test to
> be sure).

Turning an assignment into a non-assignment is bad.

>
>> I could be convinced, though -- do you want to try and make the case
>> for
>> why there should be a fresh variable per iteration with some concrete
>> examples?
>
> https://bugzilla.mozilla.org/show_bug.cgi?id=449811

Like I said, it makes sense for 'for-each.'

-Jon


More information about the Es-discuss mailing list