On Apr 30, 4:33 am, Rich Hickey <richhic...@gmail.com> wrote:
> People don't consider sets, vectors, arrays or strings to have 'keys'.  
> But, like maps, they all support fast lookup of some sort.

But of course we do. I point to the doc for contains? and get:

Usage: (contains? coll key)
Returns true if key is present in the given collection, otherwise
returns false.

Usage: (get map key)
       (get map key not-found)
Returns the value mapped to key, not-found or nil if key not present.

Both reference the notion of a "key". If referencing keys in the
documentation doesn't hurt, and makes its usage more clear, I can't
see why that reasoning wouldn't follow to the function name itself,
especially if we allow for a contains-val? (which I know is also


> Would contains-val? be fast for sets?  
As with any abstract method/function the worst-case is what's
documented.  Anyone looking at contains-val? should expect worst-case
O(n), just as anyone looking at contains-key? should expect (near)
O(1).

The deeper question is: if an abstract method/function is documented
to be worst-case O(n), then must all implementations be written to
ensure the worst-case performance, even when it could be implemented
in O(1) time?


>As a user of sets, I consider  
> them collections of values, and I absolutely would reach for contains-
> val? in any library that had it, for use with sets. If so, and I used  
> contains-val?, and I moved code from using sets to maps (happens  
> frequently), or vectors (also happens) my perf would suddenly stink.  
> If not fast on sets, why not? The reason isn't supported by the name.

Your perf stinking is a product of you testing for values, and not
keys.  The alternative would have been to use contains? with your sets
and watch (contains? s "foo") blow up when you tried to use the same
code against a vector.



> The mismatch with the seq values of maps is also disconcerting for  
> something that would purport to be sequential, as the things returned  
> by (seq amap) are key+value pairs.

Only seq-contains? purports to be related to seq, whereas contains-
val? purports to check if the value is in the collection, and to do so
in worst-case O(n) time.  Going back to your earlier point about
swapping out datastructures, (contains-val? v "foo") written against
vectors would work just fine when handed a map; seq-contains? would
give false negatives.


> Renaming contains? is not on the table.

Very well.

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

Reply via email to