I think you want:
(defn- do-traversal [tree idx & [tree-traversal]]
...)
Note the extra brackets for destructuring.
Another alternative is using multiple arg lists:
(defn- do-traversal
([tree idx]
(do-traversal tree idx []))
([tree idx traversal]
...))
Lastly, FYI, the form (if foo foo bar) can be simplified to (or foo
bar).
Hope that helps,
Justin
On Aug 2, 5:04 pm, John Sanda <[email protected]> wrote:
> I've just implemented an inorder traversal function for a vector-based tree.
> The functions look like,
>
> (defn- do-traversal [tree idx traversal]
> (cond
> (not (node-exists? tree idx)) traversal
> (leaf? tree idx) (conj traversal (tree idx))
> :else (apply conj
> (do-traversal tree (left-child idx) traversal)
> (tree idx)
> (do-traversal tree (right-child idx) traversal))))
>
> (inorder-traversal [tree]
> (do-traversal tree root-idx []))
>
> This works as expected but now I am looking to refactor the code some. I
> wanted to see if I could do away passing an empty vector to the do-traversal
> function. So I updated do-traversal to look like,
>
> (defn- do-traversal [tree idx & tree-traversal]
> (let [traversal (if tree-traversal tree-traversal [])]
> (cond
> (not (node-exists? tree idx)) traversal
> (leaf? tree idx) (conj traversal (tree idx))
> :else (apply conj
> (do-traversal tree (left-child idx) traversal)
> (tree idx)
> (do-traversal tree (right-child idx) traversal)))))
>
> When the expected traversal for a tree is [10 20 30] I instead get ([] 30 20
> 10 [])) in my unit test. Can someone explain to me why using let as I have
> done does not work, and what another solution might be?
>
> Thanks
>
> - John
--
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