[squeak-dev] Re: Problem with variable capture in blocks or ? #7532

Andreas Raab andreas.raab at gmx.de
Sun May 16 22:32:57 UTC 2010


Hi Ken -

Very interesting. Looks like an issue with OutOfScopeNotification. The 
problem appears to be that this code:

	"..." [ :a | a ].
	"..." a.

generates an OutOfScopeNotification that is being suppressed in 
workspaces (I'm not exactly sure why that is). This is of course is 
interesting because of the highly unusual situation of a temp shadowing 
a global instead of another temp / ivar. For example, this wouldn't compile:

   | a |
   [ :a | a ].

But stranglely, this does:

   [ :Object | Object ].

so your example code is roughly equivalent to running:

	b := [ :Object | Object ].
	c := b value: Object.

When you run this line by line it works 'as expected' and when you run 
it as a single doIt you get the result of c being a "[closure] in 
UndefinedObject>>DoIt" due to the OutOfScopeNotification.

Hope this explains the issue - as for how to fix it, I have no clue :-)

Cheers,
   - Andreas


On 5/16/2010 12:35 PM, Ken Causey wrote:
> Well, it's nothing new but this one has stumped me:
>
> http://bugs.squeak.org/view.php?id=7532
>
> Initially I (and Frank) thought the reporter was mistaken until we
> understood that the problem shows up when you execute the main code all
> in one do-it.  I've since modified the original report to make this
> clearer.
>
> So here it is:
>
> a := 4.
> b := [ :a | a ].
> c := b value: a.
>
> If you SELECT ALL OF THIS AND EXECUTE IT ALL AT ONE TIME (crucial
> detail). The result is that a is 4, b is a BlockClosure, and c is a
> BlockClosure not 4 as expected. Execute each statement separately and c
> is 4.
>
> Alternately, from a suggestion from jmckeon, if you specify a different
> symbol for the block argument:
>
> a := 4.
> b := [ :d | d ].
> c := b value: a.
>
> when executed all at one time works as you would expect: a is 4, b is a
> BlockClosure, and c is 4. (and d is nil)
>
> So what's up?
>
> Ken
>
>
>




More information about the Squeak-dev mailing list