I forgot to mention, if you want a Clojure persistent data structure that is efficient (O(1) or O(log n)) for all of these operations:
+ adding to/removing from beginning + adding to/removing from end + concatenating + splitting into two sequences, at any specified item in the middle look at finger trees, which Chouser has implemented for Clojure: https://github.com/clojure/data.finger-tree Andy On Sat, Dec 10, 2011 at 6:43 AM, Andy Fingerhut <andy.finger...@gmail.com>wrote: > conj adds an element to a data structure in a place most efficient for the > particular type of data structure. For lists, this is at the beginning. > For vectors, it is at the end: > > user=> (conj (conj (conj '(1 2 3) 4) 6) 7) > (7 6 4 1 2 3) > user=> (conj (conj (conj [1 2 3] 4) 6) 7) > [1 2 3 4 6 7] > > If you want something that adds to the end of a list, or the beginning of > a vector, you must implement it yourself, and it won't be O(1) as the above > are (OK, the vector version above is not quite O(1), but it is O(log n)). > Here are functions that can do the job, but take time linear in the size of > the list/vector being added to: > > user=> (defn add-at-end [l item] (concat l (list item))) > #'user/add-at-end > user=> (add-at-end '(1 2 3) 4) > (1 2 3 4) > user=> (defn add-at-front [v item] (vec (cons item (seq v)))) > #'user/add-at-front > user=> (add-at-front [1 2 3] 4) > [4 1 2 3] > > Andy > > > > > On Sat, Dec 10, 2011 at 3:13 AM, Michael Jaaka < > michael.ja...@googlemail.com> wrote: > >> Is there something like: >> >> (defn snoc[ col item ] >> (lazy-seq >> (if (seq col) >> (let[ [f & r] col ] >> (if (seq r) >> (cons f (snoc r item)) >> (cons f [item]))) >> [item]))) >> >> already here? >> >> >> (snoc (snoc (snoc [ 1 2 3] 4) 6) 7) >> >> gives: >> >> (1 2 3 4 5 6 7) >> >> -- >> 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 > > > -- 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