On Dec 2, 7:10 am, Stefan Kamphausen <ska2...@googlemail.com> wrote: > Hi, > > while studying the collection types and trying to find out which > functions work on all collection types (i.e. lists, vectors, maps, > sets) I was flabbergasted by the following > > user> (contains? (list 1 2 3) 3) > false > > OK, the doc of contains? told me that for indexed collection-types it > will only check, whether the index is within the valid range. So > maybe: > > user> (contains? (list 1 2 3) 1) > false > > At that point I dived into the implementation and found that in > RT.java checks for the type of collection passed but leaves out > PersistenList. > > I'd like to understand the (probably well-grounded) reason for that. > As far as I can see PersistentList extends Counted, so the check for > the index-range should at least be possible. However, I think people > would expect an equality check in the background, which OTOH would be O > (N), probably. > > Kind regards, > Stefan
That's because contains? checks for keys not values. Since a list isn't associative (unlike vectors and maps), it doesn't have keys, thus contains? doesn't apply. I too was first thrown off by assuming contains? worked on the values of a collection; for that you can instead use some. (if (some #(= :a) '(:a :b :c)) :contains-a :does-not-contain-a -- 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