You're right, inserting into a vector is fundamentally slow. Inserting into a list (must traverse elements) or String (Char Array) isn't any better. I get why Clojure doesn't include certain operations on certain data structures (e.g. assoc on a list), because it's the wrong tool for the job. However, there are still problems that require me to use an expensive operation.
Maybe I'm too focused on my current project, and wrong about how much a typical person would use insert. Still, its absence seems like an oversight. Sean On Apr 27, 2:05 pm, Chouser <chou...@gmail.com> wrote: > On Tue, Apr 27, 2010 at 1:31 PM, Sean Devlin <francoisdev...@gmail.com> wrote: > > Is there a built in to insert a value into an "indexed" seq? > > > For example: > > > user=> (insert [:a :b :c :d] 2 :q) > > (:a :b :q :c :d) > > > Not sure if I'm missing something simple... > > That's a vector, which cannot efficiently splice internally, so > it's not supported directly. However, you can build a new vector > with your value included: > > (apply conj [:a :b] :q [:c :d]) > ;=> [:a :b :q :c :d] > > > Also, why does this work: > > user=> (assoc [:a :b :c :d] 2 :q) > > [:a :b :q :d] > > > And this doesn't: > > user=> (dissoc [:a :b :c :d] 2) > > #<CompilerException java.lang.ClassCastException: > > clojure.lang.PersistentVector cannot be cast to > > clojure.lang.IPersistentMap (NO_SOURCE_FILE:286)> > > > Annoying. > > Again, vectors cannot efficiently insert or remove items except > from the right-hand end, though as you note items can replaced > internally. > > (let [v [:a :b :c :d]] > (into (subvec v 0 2) (subvec v 3))) > ;=> [:a :b :d] > > There are immutable collections that support both numeric-indexed > lookups and internal splicing, they're just not currently included > with Clojure. See for example finger trees: > > > http://functionaljava.googlecode.com/svn/artifacts/2.21/javadoc/fj/da... > > --Chouserhttp://joyofclojure.com/ > > -- > 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 > athttp://groups.google.com/group/clojure?hl=en -- 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