On Feb 3, 2012, at 4:26 PM, Jason Orendorff wrote:

> On 2/3/12 6:13 PM, Allen Wirfs-Brock wrote:
>> But I also have to validly (and hopefully reasonably) specify exactly what 
>> happens for the unrealistic use cases. There is a problem with your 
>> desugaring in that the evaluation of INIT isn't scoped correctly relative to 
>> V.
> Hmmm. I don't see the problem yet. I think it's scoped the way I intended it: 
> INIT is evaluated in the enclosing environment; V isn't in scope.

Under the scoping rules TC39 has agreed to, the initializer of a let/const is 
always shadowed by the binding it is initializing:

{ 
   let i="outer";
   {
      let i=i;   // throws reference error because I is initialized
   }
}

Hence, for consistency, this also should throw in the same way 
{
    let i="outer";
    for (let i=i;;){}
}

You can tweak your desugaring to get this effect by changing the first part of 
it it:

{
    let V = INIT;
    let %tmp = V, %first = true;
    while (true) {
> 
> Anyway—all this should be easier to express in spec language than via 
> desugaring, because in spec language you can give an environment a name. This 
> makes it easier to just say what you mean. Whereas if you're using 
> desugaring, scopes are *places*, so you have to very carefully say half of 
> what you mean while standing in the right place to express the rest.

agreed

> 
> -j
> 

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

Reply via email to