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 [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en