Handling   <some bag> as: Dictionary
is really quite straightforward.
Add a one-line method to Bag:

Bag>>
associationsDo: aBlock
    contents associationsDo: aBlock.

This is a good idea anyway, because currently there is a bug where
aBag associationsDo: aBlock
fails to pass Associations to aBlock.  Once you have done that,
'abracadabra' asBag as: Dictionary
just works.  This one simple addition
 - makes aBag associationsDo: aBlock work when it didn't before
 - makes aBag asDictionary work
 - makes aBag as: Dictionary work
 - makes Dictionary newFrom: aBag work




On Thu, 7 Mar 2019 at 07:35, Sven Van Caekenberghe <s...@stfx.eu> wrote:

> I am still not convinced.
>
> > On 6 Mar 2019, at 19:24, Tim Mackinnon <tim@testit.works> wrote:
> >
> > I still am tempted to make asDictionary work - because the the moment
> you get a #key , DNU error - which is definitely not right.
>
> The error might not be super clear, but it is not wrong, the elements of
> your collection do not respond to #key, a necessity to create a dictionary
> from a collection of associations/pairs.
>
> Also, if you modify #asDictionary like that, then
>
>   <some bag> as: #Dictionary
>
> will still fail.
>
> This is all not so simple as it seems.
>
> > So should Bag asDictionary give you a reasonable dictionary, or should
> it throw a proper exception - something like:
> >
> > DomainError signal: ‘#asDictionary not supported, use #valueAndCounts’
> >
> > Is that better - or do we accept that it inherits it from Collection and
> so can do something useful?
> >
> > Tim
> >
> >> On 6 Mar 2019, at 18:11, p...@highoctane.be wrote:
> >>
> >> And when asking the object:
> >>
> >> #(1 2 4 5 6 7 2 1 4 3) asBag  isDictionary
> >>
> >> we get false. So, not, not a dictionary.
> >>
> >> I still have been using #valuesAndCounts to get the dictionary out of a
> bag on several occasions.
> >>
> >> And is useful indeed.
> >>
> >> #(1 2 4 5 6 7 2 1 4 3) asBag occurrencesOf: 2
> >>
> >> and
> >>
> >> #(1 2 4 5 6 7 2 1 4 3) asBag valuesAndCounts at: 2
> >>
> >> seem pretty much the same.
> >>
> >> But in this age of streams/reactive streams and lazy evaluations, what
> do we have in Pharo on that front?
> >>
> >> Phil
> >>
> >>
> >>
> >>
> >>
> >> On Wed, Mar 6, 2019 at 4:49 PM Sven Van Caekenberghe <s...@stfx.eu>
> wrote:
> >> I was just explaining how it is now, what I think the rationale is
> behind it.
> >>
> >> I understand #asDictionary as working on a collection of
> pairs/associations (because it basically goes to #withAll:).
> >>
> >> A bag is just a collection that is optimised for many duplicates, the
> fact that you have values and counts is more an implementation detail than
> an intrinsic property.
> >>
> >> The conversion that you want, and that already exists in
> #valuesAndCounts is one interpretation of what a bag is, not the only one.
> A bag is foremost a collection of things.
> >>
> >> I am not immediately convinced that #valuesAndCounts should be the
> default #asDictionary interpretation.
> >>
> >> What about the inverse for example ?
> >>
> >>   { #foo->2. #bar->3 } asDictionary asBag.
> >>
> >> But this is certainly an interesting discussion.
> >>
> >> > On 6 Mar 2019, at 16:23, Tim Mackinnon <tim@testit.works> wrote:
> >> >
> >> > As Richard said - as a bag is relationship between keys and
> frequencies, I would expect it to be able to convert to a dictionary.
> >> >
> >> > It displays in an inspector just like a Dictionary - which is why I
> figured I could convert to pass it back to the exercise that was written
> with Dictionaries in mind.
> >> >
> >> > <PastedGraphic-3.png>
> >> >
> >> >
> >> > The code to fix it is quite simple, but on these kinds of things - I
> thought it worth checking before submitting a PR.
> >> >
> >> > Tim
> >> >
> >> >
> >> >> On 6 Mar 2019, at 13:53, Sven Van Caekenberghe <s...@stfx.eu> wrote:
> >> >>
> >> >> Why would that work ? What would you expect the output to be ?
> >> >>
> >> >> Try:
> >> >>
> >> >>  #(1 2 3) asDictionary
> >> >>
> >> >> it fails in exactly the same way. You need key/value pairs
> (Associations).
> >> >>
> >> >> These do work
> >> >>
> >> >>  Bag new add: #foo->100; asDictionary.
> >> >>
> >> >>  Bag new addAll: 'ABABABAAAA'; valuesAndCounts.
> >> >>
> >> >>> On 6 Mar 2019, at 14:25, Tim Mackinnon <tim@testit.works> wrote:
> >> >>>
> >> >>> I was surprised to find that a Bag can’t convert to a dictionary -
> e.g.
> >> >>>
> >> >>> Bag new
> >> >>>     addAll: 'aabbbbcddd’;
> >> >>>     asDictionary
> >> >>>
> >> >>> Gives an error - Dnu #key
> >> >>>
> >> >>>
> >> >>> It looks to me like Bag is inheriting a bad version of
> #associationsDo:  and instead could simply forward it to #doWithOccurences:
> instead?
> >> >>>
> >> >>> I know Bag is not used that much - but it comes up a lot in
> programming exercises.
> >> >>>
> >> >>> Tim
> >> >>
> >> >>
> >> >
> >>
> >>
> >>
> >
>
>
>

Reply via email to