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.