return when desugaring to closures

David-Sarah Hopwood david.hopwood at industrial-designers.co.uk
Mon Oct 13 22:09:46 PDT 2008


David-Sarah Hopwood wrote:
> Waldemar Horwat wrote:
>> I am talking about let bindings.  Lars brought up at that meeting.  I did not find the use cases particularly convincing, but the dead zone is compelling.  There are four ways to do this:
>> A1. Lexical dead zone.  References textually prior to a definition in the same block are an error.
>> A2. Lexical window.  References textually prior to a definition in the same block go to outer scope.
>> B1. Temporal dead zone.  References temporally prior to a definition in the same block are an error.
>> B2. Temporal window.  References temporally prior to a definition in the same block go to outer scope.
>>
>> Let's take a look at an example:
>>
>> let x = "outer";
>> function g() {return "outer"}
>>
>> {
>>   g();
>>   function f() { ... x ... g ... g() ... }
>>   f();
>>   var t = some_runtime_type;
>>   const x:t = "inner";
>>   function g() { ... x ... }
>>   g();
>>   f();
>> }
>>
>> B2 is bad because then the x inside g would sometimes refer to "outer" and sometimes to "inner".
>>
>> A1 and A2 introduce extra complexity but doesn't solve the problem.
> 
> I already suggested a solution to the problem based on a refinement of A1:
> 
> <http://www.mail-archive.com/es-discuss@mozilla.org/msg00899.html>

This post was more directly relevant:
<http://www.mail-archive.com/es-discuss@mozilla.org/msg00889.html>

> That solution is entirely compatible with runtime types. The same
> identifier can be declared with different types in different parts of
> a block, and each reference to it uses the one that is textually in
> scope, so there is no need to check compatibility of types.

-- 
David-Sarah Hopwood



More information about the Es-discuss mailing list