[Cuis-dev] [DEFECT] #copyFrom:count: for OrderedCollections

Gerald Klix cuis.01 at klix.ch
Tue Feb 6 07:57:37 PST 2024


On 2/6/24 4:44 PM, Gerald Klix wrote:
> OMG, what have I done!
>
> PLEASE DON'T!!!!!!!!!!!!!
>
> See below.
>
>
> On 2/6/24 3:56 PM, Juan Vuletich via Cuis-dev wrote:
>> On 2/1/2024 5:43 PM, Gerald Klix via Cuis-dev wrote:
>>> Hi all, Hi Juan,
>>>
>>> I found a glitch in #copyFrom:count.
>>> IHMO both expression should work:
>>>
>>> --- snip ---
>>> 1 to: 10 :: copyFrom: 1 count: 3.
>>>
>>> 1 to: 10 :: asOrderedCollection copyFrom: 1 count: 3.
>>> --- snap ---
>>>
>>> The later creates an empty OrderedCollection and fails.
>>>
>>> I attached a change set, that replaces sends of #new: with
>>> sends of #sizeOf: in various methods,
>>> although some of these methods are special cased
>>> in OrderedCollection.
>>>
>>>
>>> Best Regards,
>>>
>>> Gerald
>>
>> Thanks Gerald. I integrated this a few days ago. Still, I think that
>>
>> | n |
>> n := whatever number.
>> (AnyCollectionClass new: n) size = n
>>
>> should _always_ evaluate to true (or fail if it doesn't make sense). 
>> So I pushed some very substantial changes that kept me quite busy for 
>> several days. Now `OrderedCollection new: 10` will fail. Same for 
>> Set, Dictionary, Bag and a few others. I've adjusted many packages 
>> accordingly.
>>
>> Cheers,
>>
> Oh my goodness, that breaks so much of my and everyone else's code.
> Please don't!!!!!
>
> This behavior was already present in Smalltalk/V for MSDos
> and in Smalltalk-80 (see: https://github.com/dbanay/Smalltalk)
>
> Please note, 40 year ago my computer science education
> began more or less with Algebraic Specification:
> I am acutely aware of this inconsistency!
>
> Everyone – even language lawyers – can like with this invariant:
> (AnyCollectionClass sizeOf: n) size = n
>
> Please follow my advice!
>
>
> Best Regards,
>
> Gerald
I am also inclined to quote the ANSI Smalltalk standard:

5.7.20.2 Message: new: count

Synopsis
Create a new collection. The parameter count constrains the number of 
elements in the result.

Definition: <collection factory>
Return a new collection that has space for at least count elements.
Conforming protocols may refine this message. In particular, the effect 
of the parameter count
should be specified in refinements. It can be used to specify the exact 
number of elements, the
minimum number, or in some cases can even be interpreted as a hint from 
the programmer, with
no guarantee that the requested number of instance variables will 
actually be allocated.
Unless otherwise stated the initial values of elements, if any, of the 
new collection are unspecified.

Parameters
count <integer> unspecified

Return Values
<collection> new

Errors
none

Quoted from
https://wiki.squeak.org/squeak/uploads/172/standard_v1_9-indexed.pdf
Page 227

Page 239 is even more specific:

5.7.27.1Message Refinement: new

Synopsis
Create a new object.

Definition: <instantiator>
Return a newly created object initialized to a standard initial state.

Refinement: <collection factory>
This message has the same effect as sending the message#new:with the 
argument0, and will
return an empty collection.

Refinement: <OrderedCollection factory>

Create a new <OrderedCollection> that is optimized to store an 
implementation defined number of
elements. The new collection initially contains no elements.

Return Values
<OrderedCollection>new

Errors
none


Best Regards,

Gerald


More information about the Cuis-dev mailing list