I'm a bit surprised that it's not there already, at least in
clojure.contrib, but it's not hard to write, at least for vectors:

(defn insert [vec pos item]
    (apply merge (subvec vec 0 pos) item (subvec vec pos)))


On Tue, Apr 27, 2010 at 2:45 PM, Sean Devlin <francoisdev...@gmail.com>wrote:

> 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<clojure%2bunsubscr...@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<clojure%2bunsubscr...@googlegroups.com>
> For more options, visit this group at
> http://groups.google.com/group/clojure?hl=en
>



-- 
Mark J. Reed <markjr...@gmail.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 at
http://groups.google.com/group/clojure?hl=en

Reply via email to