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/data/Seq.html

--Chouser
http://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 at
http://groups.google.com/group/clojure?hl=en

Reply via email to