[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