Let's try this again:
(defn swap [coll i j]
(if (= i j) coll
(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 li) (rest post-li))]
(concat
pre-li
(list (nth coll ui))
post-li-pre-ui
(list (nth coll li))
(rest post-li-post-ui)))))))
The code is actually even more complicated. I'm sure with a little
more time I could clean it up.
On Nov 12, 9:59 pm, Mark Tomko <[email protected]> wrote:
> Oh, I posted too soon. My implementation has a bug.
>
> On Nov 12, 9:56 pm, Mark Tomko <[email protected]> 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 [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
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