Clojure 1.1.0-alpha-SNAPSHOT
user=> (conj (first {1 2}) 3)
[1 2 3]
user=> (conj {1 2} [2 5])
{2 5, 1 2}
user=> (key (first {1 2}))
1
user=> (key [1 2])
java.lang.ClassCastException: clojure.lang.PersistentVector cannot be
cast to java.util.Map$Entry (NO_SOURCE_FILE:0)

In all respects but one, two-sized vectors act like map entries, and
map entries act like two-sized vectors. This single exception is the
exception that the key and val forms throw when called on two-sized
vectors.

Almost one year ago, when I was completely new at Clojure, I asked
about creating map entries (http://groups.google.com/group/clojure/
browse_thread/thread/15572b6c7269096e/ab113323410dc39e). Rich Hickey
made it clear, though, that while he wants key and val to be used on
map entries, he does not want map entries to be created directly by
the user, and that map entries could be removed at any time.

I presumed in the past year that he wanted us to use vectors whenever
we wanted to create map entries, since he designed Clojure so that map
entries are equivalent to vector pairs and vice versa. But in one
aspect, this does not work. Let me give an example—processing pairs:

user=> (defn a [pairs]
         (map #(vector (key %) (inc (val %))) pairs))
#'user/a
user=> (defn b [pairs]
         (map #(vector (key %) (* (val %) 2)) pairs))
#'user/b
user=> (a {:a 3, :b 2})
([:a 4] [:b 3])
user=> (b {:a 3, :b 2})
([:a 6] [:b 4])
user=> ((comp a b) {:a 3, :b 2})
java.lang.ClassCastException: clojure.lang.PersistentVector cannot be
cast to java.util.Map$Entry

If we are not to create map entries directly, but use vector pairs
instead, then I would like vector pairs to act more like map entries:
the key and val functions should work on vectors too. This would be
elegant and complete the equivalence between map entries and vector
pairs. If this should not be, then what would be the rationale?
Otherwise, the user should be able to just create map entries instead,
since Clojure 1.0 definitely has map entries now.

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