On Tue, Aug 23, 2011 at 09:44, Mark Engelberg <mark.engelb...@gmail.com> wrote: > I had always assumed that vectors were sorted lexicographically. In > other words, you sort on the first element, and then refine by the > second element, and so on. I was surprised tonight to discover that > is not the case. > >> (compare "abc" "b") ; Strings are compared lexicographically > -1 >> (compare (vec "abc") (vec "b")) ; Vectors are not > 1 > > It turns out that shorter vectors are always considered to be "less > than" longer vectors. Lexicographic behavior only kicks in among > vectors of the same length. Not at all what I expected, so I wanted > to make sure everyone knew about this behavior.
Yea, confirmed. $ git describe clojure-1.3.0-beta1-6-g82c7254 $ java -jar target/clojure-1.3.0-master-SNAPSHOT.jar Clojure 1.3.0-master-SNAPSHOT user=> (defn sort* [ & more ] (sort more)) ;; strings: always sort lexicographically user=> (sort* "abc" "b") ("abc" "b") ;; vector: short sorts before long user=> (sort* (vec "abc") (vec "b")) ([\b] [\a \b \c]) ;; vector: same length sorts lexicographically user=> (sort* (vec "abc") (vec "abb")) ([\a \b \b] [\a \b \c]) user=> (sort* (vec "abc") (vec "abd")) ([\a \b \c] [\a \b \d]) ;; seq: does not implement comparable user=> (sort* (seq "abc") (seq "b")) ClassCastException clojure.lang.StringSeq cannot be cast to java.lang.Comparable clojure.lang.Util.compare (Util.java:92) user=> (sort* (seq (vec "abc")) (seq (vec "b"))) ClassCastException clojure.lang.PersistentVector$ChunkedSeq cannot be cast to java.lang.Comparable clojure.lang.Util.compare (Util.java:92) ;; list: does not implement comparable user=> (sort* (apply list "abc") (apply list "b")) ClassCastException clojure.lang.PersistentList cannot be cast to java.lang.Comparable clojure.lang.Util.compare (Util.java:92) It seems a shame that Clojure doesn't provide universal lexicographical comparability of sequential things, much as it provides equality for sequential things: user=> (= (list \a \b \c) (vector \a \b \c)) true Perhaps there's a good reason for this (law of unintended consequences, anyone?) that I'm not seeing. // Ben -- 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