return when desugaring to closures
Neil Mix
nmix at pandora.com
Tue Oct 14 10:22:32 PDT 2008
> What about for-in loops?
>
> I'm proceeding from user expectations being confounded. Something
> needs help here, possibly not for (;;) loops -- but almost certainly
> for-in loops containing closures capturing the loop variable.
Whatever is done should be consistent between for and for-in. My
concern was that you were suggesting that a closure over *any* let
variable binds the value and not the scope. i.e.:
let x = 5;
let f = function() {
print(x);
}
x = 6;
f(); // prints 5??
I don't think that's what you were proposing, but I wasn't entirely
clear.
> So we can have our cake and eat it too with a tail-recursive
> desugaring that forwards the previous iteration's binding value to
> the next iteration's binding. Of course any practical implementation
> will have to do more analysis than is currently done in the top open-
> source implementations I've looked at. Could be worth the cost (VM
> hackers can take the cost for the larger team of users). What do you
> think?
Yeah, I got lost in the thread and missed the subtlety of that follow-
up. I'm having a hard time seeing any downside, other than perhaps a
mild inconsistency between var and let behavior here. Worth it, just
as long as any form with the general syntax of
<keyword> ( ... <let declaration/assigment> ... ) { <body> }
behaves in the same manner. (My point being that it's syntactically
strange that let appearing outside of the braces is bound inside the
braces --thinking like a language user, not a language implementer --
but that's good behavior as long as it's consistent.)
More information about the Es-discuss
mailing list