On Thu, Jul 31, 2008 at 3:54 PM, Ramon Leon ramon.leon@allresnet.comwrote:
askoh wrote:
| block | block := [:i | Transcript cr; show: i]. 1 to: 10 do: [:i | block value: i+1]
The above should print ten times. But it only prints the
five even numbers.
That is a bug isn't it?
Aik-Siong Koh
More of a "known limitation" than a bug... due to the fact that squeak does not have proper closures.
try
| block | block := [:j | Transcript cr; show: j]. 1 to: 10 do: [:i | block value: i+1]
Keith
I was going to say that, but why does it work using (1 to: 10) do: rather than 1 to: 10 do:, seems related to #to:do: being inlined?
Yes. In the activation of to:do: there is a different counter. Look at the implementation of Number>>to:do:. So while both i's are still the same lvalue, i is not used by Number>>to:do: either to control the loop iterations or to to derive the values for the loop. Only when the loop is inlined does i become the loop control variable.
HTH
Ramon Leon http://onsmalltalk.com