I am stupid and recursion is clearly beyond my intellect. Martin Trojer has a great blog post here which I learned a lot from but I don't understand why the final example works:
http://martintrojer.github.io/clojure/2013/07/17/non-tailrecursive-functions-in-coreasync/ He offers this as an example of recursively walking a binary search tree: (defn walk [tree ch] (letfn [(walker [t] (go (when t (walker (:left t)) (>! ch (:value t)) (walker (:right t)))))] (go (<! (walker tree)) (close! ch)))) and then he writes: "This looks promising, but the results in the channel can be in any order (since there are no order guarantees in the scheduling of go processes) – this also means that some of the values might be missing since the “top” go process can be scheduled before a child one. We need a little bit more synchronisation to arrive at a working solution." and then offers this as the final working example: (defn walk [tree ch] (letfn [(walker [t] (go (when t (<! (walker (:left t))) (>! ch (:value t)) (<! (walker (:right t))))))] (go (<! (walker tree)) (close! ch)))) I am confused what this line does: (<! (walker (:left t))) It looks like we are pulling a value off channel that's returned from that call to walker? But why? We seem to be throwing this value away? I don't see it being stored anywhere. How does this give us synchronization? -- -- 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/groups/opt_out.