On Oct 16, 2011, at 10:33 PM, Nicolas Cellier wrote:

> Ah, I see, this sound appealing.
> But I would object this: (I'm speaking of do:, not only to:do:)
> 1) what the last value mean for unordered collections?
> 2) for a SequenceableCollection, the behavior is already
> (someCollection inject: nil into: [:void :each | aBlock value: each])
> 3) returning the last value in all implementors of #do: would cost
> complexification of code and possibly slow down (non clean blocks)
> 
> Is it really useful?

Not really I do not like the idea to rely on it.
 but in that case the code you be explicit

        #undefined/nil
        should be the last expression of the block.

My point was: the semantics of a block is to return the last expression and we 
should be consistent with that.

Stef

> 
> Nicolas
> 
> 2011/10/16 Stéphane Ducasse <[email protected]>:
>> for me the last expression of the block.
>> 
>> Stef
>>>>> 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