There was a discussion about Dicts/Sets on squeak dev more than year ago
http://lists.squeakfoundation.org/pipermail/squeak-dev/2007-June/117840.html

IMO making Dictionary a subclass of Set was mistake.
But there's little what can be done without risk of breaking many code.

Some related problem - about letting Sets include nils and 'self' as
elements, also was discussed on squeak-dev.
It can be done w/o breaking much compatibility.

2008/12/30 nicolas cellier <[email protected]>:
> Sorry to repost, seems that gmane did not like my first attempt...
>
>
> Stéphane Ducasse <stephane.duca...@...> writes:
>  >
>  >
>  > On Dec 29, 2008, at 12:23 PM, Alexandre Bergel wrote:
>  >
>  > > Dear List,
>  > >
>  > > I was wondering whether I am the only one shocked when I see this:
>  > >
>  > >     (Set new add: #b -> 'B'; yourself) includes: #b -> 'B' ====> true
>  > >     (Set new add: #b -> 'B'; yourself) includes: 'B'  ====> false
>  >
>  > this is correct
>  >
>  > >     (Dictionary new add: #b -> 'B'; yourself) includes: #b -> 'B'
>  > > ====>  false
>  > >     (Dictionary new add: #b -> 'B'; yourself) includes: 'B'  ====> true
>  >
>  > we should check the semantics of includes:
>  >
>  > > Dictionary inherits from Set. This means that if Set would have a
>  > > contract, it would break in Dictionary.
>  > > IMO,  we should have
>  > >     (Dictionary new add: #b -> 'B'; yourself) includes: #b -> 'B' ====>
>  > > true
>  > >     (Dictionary new add: #b -> 'B'; yourself) includes: 'B'  ====>
> false
>  > >
>  > > No?
>  >
>  > Dictionary and Set relationship is subclassing so a lot can be strange.
>  > We should fix that in Bloc.
>  >
>
>  From the st80 origin, Dictionary is a Bag of values.
> Each value of this Bag is indexed with a unique key.
>
> It is a Bag because:
> a) multiple values can be in the dictionary:
>    (Dictionary new) at: 'one' put: 1; at: 'first' put: 1; yourself.
> b) values are unordered:
>    | d1 d2 |
>    (d1 := Dictionary new: 3) at: 'one' put: 1; at: 'two' put: 2.
>    (d2 := Dictionary new: 4) at: 'one' put: 1; at: 'two' put: 2.
>    stream := (String new: 64) writeStream.
>    d1 do: [:v | stream print: v; cr].
>    d2 do: [:v | stream print: v; cr].
>    stream contents.
> And as you can see, #do: does apply on values, as would #collect:
> #select: #reject: #includes: etc...
>
> The fact that Dictionary is implemented with Associations could be seen
> as a private implementation-defined feature.
> Though, by tradition, associationsDo: has been made a public interface,
> so as the possibility to directly add an Association.
>
> But semantically, Dictionary is not a Set of Associations.
> Example:
>    (Set new) add: $a->65; add: $a->1; yourself.
>    (Dictionary new) add: $a->65; add: $a->1; yourself.
>
> Dictionary could be viewed as a Set of keys.
>  From that POV, it shared enough property with Set to be implemented as
> a subclass. That's all.
> I proposed once to detach Set and Dictionary and derive them from a
> common ancestor just for
> clarity...
>
> Nicolas
>
>
> _______________________________________________
> Pharo-project mailing list
> [email protected]
> http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project
>



-- 
Best regards,
Igor Stasenko AKA sig.
_______________________________________________
Pharo-project mailing list
[email protected]
http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project

Reply via email to