So... I tried, and failed, to use transients properly. The function below, new-gen, takes a sequence of "nodes" and creates a new generation of nodes out of them using the functions "transform-left" and "transform-right".
Each node in the sequence has two children, one is created with transform-left, the other with tranform-right. The desired result is a new sequence containing all the children, representing the "new generation". The catch is that some of the children are aborted at birth according the following rules: 1) If the child has an existing parent with a value equal to its own, it is left out of the sequence 2) If the child has an existing sibling with a value equal to its own, it too is left out of the resultant sequence The function is listed below: (defn new-gen [a] (let [t (transient [])] (doseq [f a] (doseq [n [(transform-left f) (transform-right f)]] (when-not (contains? #(= (:val n) %) (map :val (parents n))) (conj! t n)))) ;; <-- transient bashing!! (distinct #(= (:val %1) (:val %2)) (persistent! t)))) I'm also using modified versions of 'distinct' and 'contains?', the full source for them (and the new-gen function) is available in syntax-hightlighted goodness here: http://paste.pocoo.org/show/288063/ The question is: how do I write new-gen in an elegant way and avoid "bashing the transient"? I must say it would be really nice if this was considered kosher.. as it does work just fine. It would also be useful to know why transient bashing is frowned upon. Any help is greatly appreciated! - Greg -- 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