[squeak-dev] Re: New Window VM (Closures, FT2Plugin, Large Cursors)

Andreas Raab andreas.raab at gmx.de
Sun Mar 8 23:55:48 UTC 2009


Rob Rothwell wrote:
> Perfect!
> 
> Thanks...sorry for missing that the two were the same...

No worries. I've updated the image [1] with Eliot's patch so if you 
download the latest all should work as you expected it to.

[1]http://squeakvm.org/win32/release/Squeak-3.10.2-Closures.zip

Cheers,
   - Andreas

> Rob
> 
> On Sun, Mar 8, 2009 at 6:47 PM, Andreas Raab <andreas.raab at gmx.de 
> <mailto:andreas.raab at gmx.de>> wrote:
> 
>     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>
>         <mailto: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>
>         <mailto: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