Thanks Ken, I found this too when I saw Tassilo's problem on irc (didn't notice it was on ML as well). I was going submit a patch for this, but if you've already done so let me know and I won't.
On Mar 14, 12:37 pm, Ken Wesson <kwess...@gmail.com> wrote: > On Mon, Mar 14, 2011 at 4:13 PM, Tassilo Horn <tass...@member.fsf.org> wrote: > > Hi all, > > > I've implemented IEditableCollection support for ninjudd's > > PersistentOrderedSet. But when using that, my application delivered > > wrong results. See <87hbb6c4qf....@member.fsf.org> and follow-ups. > > > I was able to track it down to the strangeness in the subject: > > > (.contains (transient (hash-set)) foo) > > > returns true for any object foo, that is, the empty transient hash-set > > contains everything. > > > The above clojure code is equivalent to this java code, which I used in > > the PersistentOrderedSet extension: > > > ((ITransientSet) PersistentHashSet.EMPTY.asTransient()).contains(o) > > > For now, I worked around this strange behavior by checking the count() > > of the TransientHashSet backing my TransientOrderedSet implementation in > > addition to contains(). > > > But anyway: Is that behavior intended and facilitated internally > > somehow? If so, is there some documentation about the rationale? > > > Bye, > > Tassilo > > At first blush, the answer appears to be "no". > > Here is APersistentSet.contains: > > public boolean contains(Object key){ > return impl.containsKey(key); > > } > > Here is ATransientSet.contains: > > public boolean contains(Object key) { > return this != impl.valAt(key, this); > > } > > This should probably use a sentinel; it's possible to put a transient > map into itself, at least in principle. But the real problem: > > user=> (.valAt (.asTransient clojure.lang.PersistentHashMap/EMPTY) 1 42) > nil > > Oops! This should have returned 42, not nil! > > The actual error is on line 278 of PersistentHashMap.java: > > Object doValAt(Object key, Object notFound) { > if (key == null) > if (hasNull) > return nullValue; > else > return notFound; > if (root == null) > return null; > return root.find(0, Util.hash(key), key, notFound); > > } > > This obviously should say > > if (root == null) > return notFound; > > !!! -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en