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
>

Reply via email to