Thanks. 
Ok This is clear now - the outerContext is like my scheme environment. 
This is what I was thinking but the examples I was trying (stupidly) where just 
passing 
the block as argument to different methods and they were not changing the 
outerContext :)

Clement will write some class comments and method comments and I'm finishing 
the block chapter.
I will use this example because I realise that I forgot block nesting.
Stef

On Jul 25, 2013, at 2:44 AM, Eliot Miranda <eliot.mira...@gmail.com> wrote:

> 
> 
> On Tue, Jul 23, 2013 at 2:02 AM, Stéphane Ducasse <stephane.duca...@inria.fr> 
> wrote:
> thanks!
> It makes a lot of sense.
> I will play with another example because I want to really understand the 
> outerContext of closure vs the home context.
> 
> The outerContext is a link in the static chain.  Each block is created inside 
> some context.  This is the block's outerContext.  If the block is not nested 
> then the outerCOntext will also be the home context  But if the block is 
> nested inside another block activation, then the outerContext refers to that 
> block activation, and the block activation's block's outerContext is the home 
> context.  So there are as many outerContext steps as there are nesting levels.
> 
> | homeContext b1 |
> homeContext := thisContext.
> b1 := [| b2 |
>           self assert: thisContext closure == b1.
>           self assert: b1 outerContext == homeContext.
>           b2 := [self assert: thisContext closure == b2.
>                     self assert: b2 outerContext closure outerContext == 
> homeContext].
>           b2 value].
> b1 value 
> 
> Ignore the "bN appears to be undefined at this point" and evaluate the above. 
>  No assert fails.
> 
> Draw a picture.
> 
> 
> Stef
> 
> On Jul 23, 2013, at 6:58 AM, Clément Bera <bera.clem...@gmail.com> wrote:
> 
>> This is because of compilation optimization.
>> 
>> 2013/7/22 Stéphane Ducasse <stephane.duca...@inria.fr>
>> Hi
>> 
>> when I execute the following
>> 
>> first
>>         "Bexp new first"
>>         | temp |
>>         temp :=  2.
>>         [ temp.
>>         thisContext inspect.] value.
>>         ^ temp
>> 
>> tmp in the inspector is nil and does not hold 2 and I was wondering why.
>> I thought that thisContext was returning the blockContext
>> In the outercontext of thisContext blockClosure, tmp is also nil.
>> 
>>  
>> This is because here 'temp.' is evaluated for effect (the value is not 
>> stored anywhere) and it has no side effect (reading a variable cannot lead 
>> to a modification of state of another object). So the compiler removes it. 
>> As it is removed, it is the same as if it was not in the block. So the block 
>> cannot access temp. Now write 'temp:= #foo' or 'temp foo' you will get it.
>>  
>> first
>>         "Bexp new first"
>>         | temp |
>>         temp :=  2.
>>         [ temp.
>>         temp traceCr.
>>         thisContext inspect.] value.
>>         ^ temp
>> 
>> output 2 on the transcript.
>> 
>> In this case 'temp.' is still removed, but the value of temp still need to 
>> be copied in the block for ' temp traceCr.'.'temp traceCr' is also evaluated 
>> for effect, but has the side effect to output the transcript, so the 
>> compiler cannot remove it.
>> 
>> Basically the is very few things that the compiler removes, and one of them 
>> is variable read for effect, because you are sure it cannot lead to any 
>> issue.
>>  
>> Stef
>> 
>> 
> 
> 
> 
> 
> -- 
> best,
> Eliot

Reply via email to