[squeak-dev] Re: New Window VM (Closures, FT2Plugin,
Large Cursors)
Andreas Raab
andreas.raab at gmx.de
Sun Mar 8 22:47:32 UTC 2009
That is the bug Eliot was referring to earlier. The loop variable in
optimized to:do: loops wasn't handled correctly. Try this instead:
multiply := Array new: 4.
(1 to: 4) do: [:i |
multiply at: i put: [:x | x * i].
].
Note the parens around "1 to: 4" which prevents the block from being
optimized.
Cheers,
- Andreas
Rob Rothwell wrote:
> Ok...thanks...this is making sense!
>
> So...should I get the "right answer" with the new VM and the
> 3.10.2-Closures image?
>
> Because...I still get 25!
>
> Rob
>
> On Sun, Mar 8, 2009 at 2:01 PM, Bert Freudenberg <bert at freudenbergs.de
> <mailto:bert at freudenbergs.de>> wrote:
>
> On 08.03.2009, at 18:13, Rob Rothwell wrote:
>
> On Sun, Mar 8, 2009 at 12:38 PM, Bert Freudenberg
> <bert at freudenbergs.de <mailto:bert at freudenbergs.de>> wrote:
>
> multiply := Array new: 4.
> 1 to: 4 do: [:i |
> multiply at: i put: [:x | x * i].
> ].
>
> And you would rightfully assume that this is equivalent to
> the version above, just more concise. But now try again:
>
> (multiply at: 3) value: 5.
>
> The answer will, surprisingly, not be 15 in current Squeak.
>
>
> You are right! 25, in fact...
>
> But with closures, the blocks would behave as expected. They
> are said to "close over" the state that the bound variables
> (i in this case) had at the time the block was created.
>
>
> So...VW does this "right," I guess, since I get 15 in VW NC 7.6?
>
>
> Yes, it has block closures.
>
>
> So basically, you can use blocks as you always have, but
> they will behave as you might have assumed they would.
>
> So the recent VM work discussed handles this? I will have to
> give that a try!
>
> Thanks for the explanation! The next question, of course, is
> WHY does it get 25 and not 15... ;)
>
>
>
> Because instead of "closing over" the current value of i when the
> block is created, all the blocks share the same reference to i,
> which is actually another temporary variable of the method, instead
> of being local to the block. So when the block is evaluated later,
> the last value of i is used.
>
> Now you might still expect that last value of i to be 4, but
> actually "1 to: 4 do:" is expanded by the compiler to a while loop
> like "i := 1. [i <= 4] whileTrue: [i := i + 1]", so it actually is 5
> after the loop terminates.
>
> And all this is avoided by having real closures, the i would indeed
> be local to the block and not a shared temp.
>
> - Bert -
>
>
>
>
> ------------------------------------------------------------------------
>
>
More information about the Squeak-dev
mailing list
|