I'm very new to continuation passing style (CPS), and as part of the learning process I've done a CPS version of a "flatten" function. Ie, it does the same thing as the standard clojure "flatten", but is implemented using a recursive local CPS helper function. I'm interested in comments / critiques on what I've done.
Here it is... (defn my-flatten [xs] (letfn [(my-flatten-cps [xs k] (if (nil? xs) (k '()) (let [x (first xs), ys (next xs)] (if (sequential? x) (recur ys (fn [v] (my-flatten-cps (seq x) (fn [w] (k (concat w v)))))) (recur ys (fn [v] (k (conj v x))))))))] (my-flatten-cps (seq xs) identity))) I'm relatively inexperienced with clojure, so please feel free to suggest improvements to my clojure code. But what I'm most interested in is understanding CPS better and about how it interacts with Clojure and with "recur". As you can see, my-flatten-cps uses recur nicely to traverse at a breadth level. But as we sink down into depth, I've done an actual non-recur call to my-flatten-cps. I presume I can't do a recur here instead (because it would attempt to jump to the most immediate fn??) - is this correct? Is there any way around this? (As I write this, the word "trampoline" comes to mind - some videos I've watched speak of this - but not sure how this would work and what efficiency trade-offs would be involved.) The other things is... is it so bad that it is not fully using recur - maybe using a bit of stack is okay?? Thanks, Mark. -- 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 unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.