To use the zipper library you have to be able to provide branch? children 
and make-node functions that apply to your data structure.

I don't see a way to provide a meaningful branch? or children function for 
the structure you describe. Vector? will not work as branch? as it will not 
return true if passed the first element in a vector, and next will not work 
as it will not return the children if passed the first element of a vector.

It looks to me like you don't get past the first element because the call 
to z/next fails both (and (branch? loc) (down loc)), (right loc) and (up loc) 
and therefore marks the first element as the end of the of the structure.

Is there a compelling reason for not using the vector-zip structure for 
your specific use-case?


On Wednesday, November 27, 2013 2:59:40 AM UTC+1, dabd wrote:
>
> The built-in vector-zip will build a tree with a different structure than 
> what I need.
> I want build a tree as described in the first post: the node value is the 
> first element of the vector and the children the rest of the elements.
>
>
> zipper.core>  (loop [loc (tree-zipper [1 2 [3 4 5]])]
> (if (z/end? loc)
>   (z/root loc)
>   (do (println (z/node loc))
>       (recur (z/next loc)))))
> [1 2 [3 4 5]]
>
> 2
>
> [3 4 5]
>
> 4
>
> 5
>
> [1 2 [3 4 5]]
> zipper.core>  (loop [loc (z/vector-zip [1 2 [3 4 5]])]
> (if (z/end? loc)
>   (z/root loc)
>   (do (println (z/node loc))
>       (recur (z/next loc)))))
> [1 2 [3 4 5]]
>
> 1
>
> 2
>
> [3 4 5]
>
> 3
>
> 4
>
> 5
>
> [1 2 [3 4 5]]
>
>
> On Tuesday, November 26, 2013 11:56:45 PM UTC, martin_clausen wrote:
>>
>> With a nested vector tree you can use the built in vector-zip function to 
>> create your zipper.
>>
>> As to the editing, the source 
>> code<https://github.com/clojure/clojure/blob/master/src/clj/clojure/zip.clj> 
>> contains 
>> a very similar use-case, which can be adapted to something like the 
>> following:
>>
>> (let [vz (vector-zip [1 2 [3 4 5]])]
>>         (loop [loc vz]
>>           (if (end? loc)
>>             (root loc)
>>             (recur (next (if (and (integer? (node loc)) (odd? (node loc)))
>>                    (replace loc (* 2 (node loc)))
>>                    loc))))))
>>
>> > [2 2 [6 4 10]]
>>
>> On Tuesday, November 26, 2013 10:50:34 PM UTC+1, dabd wrote:
>>>
>>> I am trying to work with a tree representation using vectors where the 
>>> first element is the node value and the rest are the children as suggested 
>>> here:
>>>
>>> http://grokbase.com/t/gg/clojure/12afy2cz9p/how-to-represent-trees-for-use-with-zippers
>>>
>>> However I am having trouble using clojure.zip/edit to change a simple 
>>> tree. I'd like to multiply the odd numbers by 2 in this case.
>>> https://gist.github.com/dabd/7666778
>>>
>>> It looks like after editing the first (branch) node clojure.zip/next 
>>> will get to the end of the tree.
>>> How can I correct this code?
>>>
>>> Thanks.
>>>
>>>

-- 
-- 
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.

Reply via email to