2011/10/16 Eliot Miranda <[email protected]>: > > > On Sun, Oct 16, 2011 at 10:09 AM, Nicolas Cellier > <[email protected]> wrote: >> >> 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? > > That's not the right question. IMO the compiler should answer the same > result as the non-inlined one when the return value is asked for. Arguably > the non-inline version needs to be commented to specify that it returns the > value it does (in this case self), and that the compiler's optimiser > reflects this. >
Agree, but I was wondering what useful object this common answer could be? >> >> 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 >> > > > > -- > best, > Eliot >
