Oh, I posted too soon. My implementation has a bug. On Nov 12, 9:56 pm, Mark Tomko <mjt0...@gmail.com> wrote: > I came up with a way to do it, but I'm sure there's a simpler way. > Here's what I have: > > (defn swap [coll i j] > (let [li (min i j) ui (max i j)] > (let [[pre-li post-li] (split-at li coll)] > (let [[post-li-pre-ui post-li-post-ui] (split-at (- ui 1) (rest > post-li))] > (concat > pre-li > (list (nth coll j)) > post-li-pre-ui > (list (nth coll i)) > (rest post-li-post-ui)))))) > > Basically, I find the lower index and the upper index. I then find > the elements in the collection that appear before the lower index, and > the elements that appear between the lower index and the upper index, > and the elements that appear after the upper index. I then create a > new list that is the concatenation of these sublists, in order. It's > sort of the definition of swap on an immutable data structure, but it > feels like an awful lot of code. > > I considered using subvec: > > http://clojure.org/api#toc548 > > But I didn't want to require that my input collection be a vector, or > convert it to one. This the precursor to my implementing a heap data > structure, as a little toy application.
-- 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