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 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 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

Reply via email to