the sequence functions operate on sequences. if you pass in something that is not a sequence, like a vector, they call seq on it internally. so what you get back from filter or map is a sequence. conj has consistent behavior across types, you just get a different type out of map/filter/etc then what goes in.
On Mon, Jul 13, 2009 at 8:15 AM, Jan Rychter<j...@rychter.com> wrote: > > I've been trying to implement stacks using vectors in Clojure. In case > you wonder why, it's because I need stacks with a fast item count > operation. While experimenting I discovered some vector properties which > were unexpected. > > conj adds at the end of the vector as expected: > > user> (conj [1 2 3] 4) > [1 2 3 4] > > However, after reading "Programming Clojure" (page 114) I expected to be > able to use sequence functions, such as drop-last, without my vectors > changing representation. It seems this is not the case, as after calling > drop-last (or indeed any of the seq functions) conj no longer adds at > the end: > > user> (conj (drop-last 1 [1 2 3]) 4) > (4 1 2) > > I don't know if it also has performance implications (does it turn my > vector into a list?). So it turns out that pretty much the only > operations I can use on my vectors are subvec and pop: > > user> (conj (subvec [1 2 3] 0 2) 4) > [1 2 4] > user> (conj (pop [1 2 3]) 4) > [1 2 4] > user> > > I didn't expect this to happen. Most tutorials (and Stuart Halloway's > book) emphasize the generality of the sequence functions, only > mentioning that subvec is faster for vectors. I think the fact that they > also change subsequent behavior of conj is fundamental and should be > printed in bold type. > > Am I missing something here? > > And while we're on the subject -- any hints for implementing a stack > with a fast item count? (apart from a list with a separate counter) > > --J. > > > > -- And what is good, Phaedrus, And what is not good— Need we ask anyone to tell us these things? --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---