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

Reply via email to