Ok. Question was from Martin.

What behaviour we want from��WeakValueDictionary for garbaged values?

dictionary := WeakValueDictionary with: 'hello' -> 'world' copy.
Smalltalk garbageCollect.
{
dictionary values includes: nil.
dictionary at: 'hello'.
dictionary at: 'hello' ifAbsent: [ 'absent' ].
dictionary at: 'hello' ifAbsentPut: [ 'put' ].
}��
is:
#(true nil nil nil)

My opinion is: it should work in same way when 'hello' item is absent.
It is intuitive for me and It would be consistent to WeakSet behaviour:

set := WeakSet with: Object new.
Smalltalk garbageCollect.
set includes: nil "=>false"

But after writing it I realized how much WeakSet is��inconsistent:

set := WeakSet with: Object new.
Smalltalk garbageCollect.
set isEmpty. "=>false"
set size. "=>1".
set anyOne. "=> nil"
set includes: nil. "=>false"
set collect: #yourself. "=>a WeakSet()"

We definitely have something to improve here.

2017-02-21 13:36 GMT+01:00 Guillermo Polito <guillermopolito@gmail.com>:
Everything has a tradeoff. I do not understand the question.

On Tue, Feb 21, 2017 at 1:19 PM, Denis Kudriashov <dionisiydk@gmail.com> wrote:

2017-02-21 13:07 GMT+01:00 Guillermo Polito <guillermopolito@gmail.com>:
But in any case, whatever the alternative you give users, they must understand the tradeoff. If all Weak*Dictionaries were subscribed by default to the weak registry for cleanup, that would provoke a lot of overhead during garbage collection.

So you think my suggestion for implementation will lead to some tradeoff? What exactly? (if yes).