Mark Engelberg wrote:
> 2009/11/9 Tiago Antão <[email protected]>:
>> What is the rationale for even? and contains? having different
>> behaviors for the exact same error (ie, one throws the other works
>> fine and just returns false on a type error)?

> I imagine the rationale is efficiency.  

Here's the function from clojure/lang/RT.java:

static public Object contains(Object coll, Object key){
         if(coll == null)
                 return F;
         else if(coll instanceof Associative)
                 return ((Associative) coll).containsKey(key) ? T : F;
         else if(coll instanceof IPersistentSet)
                 return ((IPersistentSet) coll).contains(key) ? T : F;
         else if(coll instanceof Map) {
                 Map m = (Map) coll;
                 return m.containsKey(key) ? T : F;
         }
         else if(key instanceof Number && (coll instanceof String ||
                         coll.getClass().isArray())) {
                 int n = ((Number) key).intValue();
                 return n >= 0 && n < count(coll);
         }
         return F;
}


That last return could be changed to a throw and it wouldn't make things 
any slower (in the non-error case).  Note that 'get' always behaves the 
same way, so I guess it's probably intentional for associative lookups, 
I can't see why though.

   (get 3 3)
   => nil


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to