I usually run a little on the cowardly side and try to avoid depending on most-recently-evaluated behavior, because it is easy to break it in subsequent revision.
However, I *think* that the value of the most-recently-evaluated expression is what one expects in situations like this. #inject:into: is where I typically encounter it. HTH, Bill ________________________________________ From: [email protected] [[email protected]] On Behalf Of Nicolas Cellier [[email protected]] Sent: Sunday, October 16, 2011 1:09 PM To: [email protected] Subject: Re: [Pharo-project] Fwd: trying to understand loops in pharo Well, the inlined to:do: doesn't behave the same as non inlined one: |result| result := String new. 1 to: 10 do: [:n | result := result, n printString, ' '] yourself. --> 1 The inlined byte code is explicitely returning nil (at byte 60) (Compiler new compileNoPattern: '|result| result := String new. 1 to: 10 do: [:n | result := result, n printString, '' '']' in: Object context: nil notifying: nil ifFail: nil) generateWithTempNames. 37 <40> pushLit: String 38 <CC> send: new 39 <68> popIntoTemp: 0 40 <76> pushConstant: 1 41 <69> popIntoTemp: 1 42 <11> pushTemp: 1 43 <24> pushConstant: 10 44 <B4> send: <= 45 <AC 0D> jumpFalse: 60 47 <10> pushTemp: 0 48 <11> pushTemp: 1 49 <D2> send: printString 50 <E1> send: , 51 <23> pushConstant: ' ' 52 <E1> send: , 53 <68> popIntoTemp: 0 54 <11> pushTemp: 1 55 <76> pushConstant: 1 56 <B0> send: + 57 <69> popIntoTemp: 1 58 <A3 EE> jumpTo: 42 60 <73> pushConstant: nil 61 <7C> returnTop Which return value would be useful? Nicolas 2011/10/16 Stéphane Ducasse <[email protected]>: > A friend of mine ask me the following > > |result| > result := String new. > 1 to: 10 do: [:n | result := result, n printString, ' ']. > I am trying to do or print this code. It prints 'nil' instead of a > collection. Its an example from PBE book. > do you know the reason? > although this one's working: > result := String new. > (1 to: 10) do: [:n | result := result, n printString, ' ']. > > I checked the implementation > Interval>>do: aBlock > "Evaluate aBlock for each value of the interval. > Implementation note: instead of repeatedly incrementing the value > aValue := aValue + step. > until stop is reached, > We prefer to recompute value from start > aValue := start + (index * step). > This is better for floating points accuracy, while not degrading Integer and > Fraction speed too much. > Moreover, this is consistent with methods #at: and #size" > | aValue index size | > index := 0. > size := self size. > [index < size] > whileTrue: [aValue := start + (index * step). > index := index + 1. > aBlock value: aValue] > > Number>>to: stop do: aBlock > "Normally compiled in-line, and therefore not overridable. > Evaluate aBlock for each element of the interval (self to: stop by: 1)." > | nextValue | > nextValue := self. > [nextValue <= stop] > whileTrue: > [aBlock value: nextValue. > nextValue := nextValue + 1] > > any further idea than := value is different from value: > Stef
