user=> (doc merge)
-------------------------
clojure.core/merge
([& maps])
  Returns a map that consists of the rest of the maps conj-ed onto
  the first.  If a key occurs in more than one map, the mapping from
  the latter (left-to-right) will be the mapping in the result.
nil


According to merge's doc string it is meant to work on maps.  However,
this is only part of the truth:

user=> (merge '(1) 2)
(2 1)


user=> (merge [1] 2)
[1 2]

user=> (merge #{1} 2)
#{1 2}

Of course, the canonical example:

user=> (merge {:name "ryan"} {:age 25})
{:age 25, :name "ryan"}

What's the point?  Maybe the doc string should be changed to be more
general, or perhaps merge should check that it is indeed working with
maps?

Personally, this doesn't bother me all that much.  However, if people
rely on this behavior then it could be harmful if in a future version
of Clojure merge only works for maps, or if it's results change for
the other types of structures.  I feel that a doc string should act as
a contract between the function and it's user (think Eiffel).  I think
the contract for merge could be improved.

-Ryan
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To post to this group, send email to [email protected]
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