I tried to get the results using some clever one liner but couldn't
come up with it. It looks like rolling your own function is the way to
go (but I would love to see this proven wrong).
It would be very helpful if there were a function that does vector
difference, like the one for sets. For example:
(use 'clojure.set)
(defn remove-at2 [coll & indexes]
(vec (difference (set coll)
(set (map #(coll %) (vec indexes))))))
could become:
(defn remove-at-hypothetical [coll & indexes]
(vec-difference coll
(map #(coll %) (vec indexes))))
Unfortunately, the set version does not maintain the order of elements
in the vector.
Here is the recursive version that does keep the order of elements
intact:
(defn remove-at3 [coll & indexes]
(loop [idx (vec indexes) result coll]
(if (empty? idx)
(vec result)
(let [current (coll (first idx))
new-result (if current (remove #(= % current) result) result)]
(recur (rest idx) new-result)))))
I'm not sure which version is more idiomatic, but the last one seems
to give me the best performance out of all versions.
On Feb 18, 1:10 am, CuppoJava <[email protected]> wrote:
> Mmm, subvec doesn't quite seem to do the same thing.
>
> I want a function that removes certain indexes of a vector:
> eg. (remove_at [1 2 3 4 5 6] 0 3) => [2 3 5 6]
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To post to this group, send email to [email protected]
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
-~----------~----~----~----~------~----~------~--~---