Brilliant! Thanks Denis Those are 2 great tips. I had looked through the documentation until my eyes went square but I'm not very well practiced with all the functions so I decided to ask the community for help. take-while was exactly what I needed.
Many Thanks Adrian On Thursday, 26 July 2012 08:58:13 UTC+1, Adrian Mowat wrote: > > Hi Folks > > I have a program that parses a string into rows and fields by repeatedly > applying a sequence of functions repeatedly until the end of the string is > reached. Each function (or chunker, as I have called them) knows how to > find the next field in the stream and returns the field and the remainder > of the input text. > > I've come up with a recursive implementation as shown below but I am > wondering if this is idomatic or if there is a better way using while, for > or something like that? > > (defn read-row [chunkers text] > "Applies a list of functions to a string. Returns > a vector of fields found and any remaining text. > (read-row comma-chunkers \"foo,bar,bop,baz,\") => [[\"foo\" \"bar\"] > \"bop,baz,\"]" > > (reduce #(read-chunk %2 %1) (cons text chunkers))) > > (defn read-all-rows [chunkers starting-text] > "Repeatedly applies chunkers to text until the end of the > text is reached." > > (reverse (loop [text starting-text result []] > (if (empty? text) > result > (let [[row remainder] (read-row chunkers text)] > (recur remainder (cons row result))))))) > > The full source is at https://github.com/mowat27/clam > > Hopefully that makes sense but please let me know if you have any queries > > Many Thanks > > Adrian > -- 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