[Pharo-dev] [Vm-dev] modified method temp references in closures: possible bug?

Igor Stasenko siguctua at gmail.com
Fri Aug 2 13:35:15 UTC 2013


On 2 August 2013 15:27, Max Leske <maxleske at gmail.com> wrote:
>
> Sorry, yes, "dict" should be "collection".
>
>
> On 02.08.2013, at 15:16, Clément Béra <bera.clement at gmail.com> wrote:
>
> This is not a bug.
>

yes, the expression:

[ methodScope ]

does not capturing the current value of methodScope variable.

means that closure, when evaluated will always return the value
methodScope at the moment of evaluation.

Closures do not capturing values of free variables, because then it
will mean different semantic than rest of code (in method's body).


> Here your variable methodScope is defined outside the block, therefore all the blocks and the method refers to the same variable when calling methodScope.
>
>
> Yes, I understand that. I just wanted to make sure that's the intended functionality. The reason I ask is that the error isn't easy to spot and there's no cue that one might be doing something wrong (It's not my code by the way :P). Especially for newcomers this can be a tricky one.
>
> I totally agree with you that the variables belong to the block and should be declared there.
>
>
> Your code is the same as if you wrote :
> | methodScope |
> methodScope := 1.
> methodScope := 2.
> At the end, methodScope is of course 2.
>
> If you want the result :
> 1
> 2
> you have to declare the variable in the block (then there are different variable named methodScope, actually 1 per activation of the block.
>
> collection := OrderedCollection new.
> 1 to: 2 do: [ :index |
>         | methodScope |
>         methodScope := index.
>         dict add: [ methodScope ] ].
> collection do: [ :block | Transcript show: block value; cr ]
>
>
> 2013/8/2 Max Leske <maxleske at gmail.com>
>>
>>
>> I just came across this (possible) bug and I'm able to reproduce it in Pharo 2.0 and 3.0 with the latest PharoVM (found in a 1.3 with NBCog):
>>
>> expected (by my feeble mind):
>> 1
>> 2
>>
>> actual:
>> 2
>> 2
>>
>> | methodScope |
>> collection := OrderedCollection new.
>> 1 to: 2 do: [ :index |
>>         methodScope := index.
>>         dict add: [ methodScope ] ].
>>
>> collection do: [ :block | Transcript show: block value; cr ]
>>
>> I'm aware that using method temps in this way is not good programming style (usually) but I still think this behavior is curious if not at least very likely to cause a lot of weird errors.
>>
>> Should I open a bug report?
>>
>> Cheers,
>> Max
>
>
>
>



-- 
Best regards,
Igor Stasenko.


More information about the Vm-dev mailing list