Ramon Leon <ramon.leon <at> allresnet.com> writes:
Sent: Thursday, July 31, 2008 3:33 PM To: squeak-dev <at> lists.squeakfoundation.org Subject: [squeak-dev] Serious bug in 3.10
| 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
Try this..
block := [:f | Transcript cr; show: f]. (1 to: 10) do: [:f | block value: f+1]
And you'll see that likely, to:do: is being inlined by the compiler and causing something funny like allowing you to increment the loops index var causing it to skip a number each iteration.
Ramon Leon http://onsmalltalk.com
Yes but:
block := [:f | Transcript cr; show: f]. (1 to: 10) do: [:f | block value: f+1. block value: f].
does not behave much better... the 10 loops are performed, but since the blocks share same temporary f, things are still a bit strange.
You need to use different argument names, NewCompiler or Eliot's closures.