Thanks Martin :) On Thu, Feb 23, 2017 at 6:18 AM, Martin Dias <[email protected]> wrote:
> > > On Wed, Feb 22, 2017 at 9:52 AM, Guillermo Polito < > [email protected]> wrote: > >> >> >> On Wed, Feb 22, 2017 at 12:57 AM, Martin Dias <[email protected]> >> wrote: >> >>> Hi all >>> >>> Phil: >>> I'm sorry, didn't get what you point with the code snippet. The copy of >>> the Symbol is the same instance, that I think it's nto GCed. >>> >>> Guille: >>> Yes, I knew the internals of the WeakValueDictionary but asked about the >>> API. >>> >> >> Ah, ok, I only understood that you did not get why it was like that. :) >> >> >>> What I don't know is about using WeakRegistry >>> >> >> This is just needed to do the cleanup of the expired associations. >> >> >>> and Ephemerons. >>> >> >> This is a completely different thing. There is an EphemeronRegistry in >> the image, but it does not propose at:/at:ifAbsent: messages. It just holds >> Ephemerons. >> >> I'll check WeakKeyDictionary. >>> >> >> If you need to hold weakly the values, then this is not what you're >> looking for, isn't it? >> >> >>> >>> I understand the idea of "explicit control of magic", but not sure if I >>> understand concretely. Do you mean to implement something like >>> WeakValueDictionary>>register which will not be executed by >>> #initialize, so the user can decide to register. Am I right? >>> >> >> Yep. I would even call it: >> >> registerForCleanup >> >> Like that it is explicit that you're doing it, and that it may incur into >> some performance degradation of the entire system. >> >> >>> >>> Denis: >>> +1 WeakSet behavior is really confusing! In thte case of >>> WeakValueDictionary I didn't check for inconsistencies but was only annoyed >>> but it's behavior. >>> >>> Guille and Denis: >>> Instead of using SetElement or cleaning up the empty >>> WeakValueAssociations, what I first thought is to internally consider an >>> association with nil as absent. I mean, modify or override some methods >>> soem when there is an WeakValueAssociation with value == nil it >>> considers it's absent. Concretely, I'd expect: >>> >> >> Well, the idea of the SetElement is that you may want to have `nil` as a >> valid value in your dictionary. Otherwise, you cannot do: >> >> WeakValueDictionary new >> at: 'key' put: nil; >> at: 'key' --> error??? >> >> We can discuss if it is useful or not, but as with sets, before people >> used to check if the inserted element was nil beforehand to have the >> expected behavior... >> >> >>> | dictionary | >>> dictionary := WeakValueDictionary with: 'hello' -> 'world' copy. >>> Smalltalk garbageCollect. >>> { >>> dictionary values includes: nil. *---> false * >>> dictionary at: 'hello'. * ---> NotFound signal* >>> dictionary at: 'hello' ifAbsent: [ 'absent' ].* ---> 'absent'* >>> dictionary at: 'hello' ifAbsentPut: [ 'put' ]. *---> 'put'* >>> } >>> >> >> I agree that we may review the API. At least #at:, #at:ifAbsent: and >> #at:ifAbsentPut: should behave similarly. >> >> > OK, I wrote several tests for the expected behavior and fixed > WeakValueDictionary. Anyway, not sure if it's convenient to integrate it in > Pharo 6 or in any version... maybe it's just OK to check for nils at > user-level as currently, and do not change it. I had to use SetElement else > tests didn't pass. > > https://pharo.fogbugz.com/f/cases/19746/WeakValueDictionary-has- > counter-intuitive-behavior > > > > >> In any case, we could see how to improve EphemeronRegistry or even >> implement an EphemericDictionary that would replace the WeakValueDictionary. >> >> >>> >>> It's better if I give some context. Look this simplified version of my >>> use case: >>> >>> MyUI>> >>> morphAt: key >>> cache ifNil: [ cache := WeakValueDictionary new ]. >>> ^ cache at: key ifPresent: [:cachedValueOrNil | cachedValueOrNil >>> ifNotNil: [ cachedValueOrNil ] ifNil: [ cache at: entryReference put: (self >>> newMorph: key) ] ] ifAbsent: [ cache at: entryReference put: (self >>> newMorph: key) ] >>> >>> I'd like to only send #newMorph: in ifAbsent: and to avoid the >>> ifNotNil:ifNil: >>> Like this: >>> >>> morphAt: key >>> cache ifNil: [ cache := WeakValueDictionary new ]. >>> ^ cache at: key ifAbsent: [ cache at: entryReference put: (self >>> newMorph: key) ] >>> >>> :-) >>> >>> MartÃn >>> >> >> >
