Shouldn't be a practical problem just wondering if it's correct given the 
zipper definition requirements.

On Wednesday, November 27, 2013 3:40:36 PM UTC, martin_clausen wrote:
>
> You are right, but why is this a problem? The zipper works as intended 
> and if you need to detect leaf nodes, that kan be done by checking for 
> the presence of a non-empty value of the children key. 
>
> On Wed, Nov 27, 2013 at 2:18 PM, dabd <dario....@gmail.com <javascript:>> 
> wrote: 
> > Your map-tree is exactly like an xml-zip. 
> > The problem I find with it is that now branch? also returns true for 
> leaf 
> > nodes: 
> > 
> > (def m (map-tree {:v 1 :cs [{:v 2} {:v 3 :cs [{:v 4} {:v 5}]}]})) 
> > 
> >> (-> m z/down) 
> > [{:v 2} {:l [], :pnodes [{:v 1, :cs [{:v 2} {:v 3, :cs [{:v 4} {:v 
> 5}]}]}], 
> > :ppath nil, :r ({:v 3, :cs [{:v 4} {:v 5}]})}] 
> > 
> >> (-> m z/down z/branch?) 
> > true 
> > 
> > (def t (tree-zip [1 2 [3 4 5]])) 
> > 
> >> (-> t z/down z/branch?) 
> > false 
> > 
> > On Wednesday, November 27, 2013 9:26:53 AM UTC, martin_clausen wrote: 
> >> 
> >> Ah, sorry. You could use a map-tree instead. It is a bit more verbose, 
> >> but I believe it does what you want. 
> >> 
> >> (defn map-tree [root] 
> >>         (z/zipper 
> >>          map? 
> >>          #(seq (:cs %)) 
> >>          (fn [node children] 
> >>               (assoc node :cs (and children (apply vector children)))) 
> >>          root)) 
> >> 
> >> (let [mt  (map-tree {:v 1 :cs [{:v 2} {:v 3 :cs [{:v 4} {:v 5}]}]})] 
> >>         (loop [loc mt] 
> >>           (if (z/end? loc) 
> >>             (z/root loc) 
> >>             (recur (z/next (let [n  (:v (z/node loc))] 
> >>                              (if (and (integer? n) (odd? n)) 
> >>                    (z/replace loc {:v(* 2 (:v (z/node loc))) :cs 
> >> (z/children loc)}) 
> >>                    loc))))))) 
> >> 
> >> On Wed, Nov 27, 2013 at 8:35 AM, dabd <dario....@gmail.com> wrote: 
> >> > The problem is that your vector-zip is not representing the tree I 
> >> > pictured. 
> >> > 
> >> > 
> >> > On Wednesday, November 27, 2013 6:26:12 AM UTC, martin_clausen wrote: 
> >> >> 
> >> >> Yes, for instance like this: 
> >> >> 
> >> >> (let [vz (z/vector-zip [1 [2] [3 [4 5]]])] 
> >> >>         (loop [loc vz] 
> >> >>           (if (z/end? loc) 
> >> >>             (z/root loc) 
> >> >>             (recur (z/next (if (and (integer? (z/node loc)) (odd? 
> >> >> (z/node 
> >> >> loc))) 
> >> >>                    (z/replace loc (* 2 (z/node loc))) 
> >> >>                    loc)))))) 
> >> >> 
> >> >> Which lets you avoid writing half the infrastructure yourself. 
> >> >> 
> >> >> On Wed, Nov 27, 2013 at 6:19 AM, dabd <dario....@gmail.com> wrote: 
> >> >> > I'm not sure what you mean by not being able to provide a 
> meaningful 
> >> >> > branch?. 
> >> >> > 
> >> >> > I would like to represent a tree such a this: 
> >> >> > 
> >> >> >                                   1 
> >> >> > 
> >> >> >                   / \ 
> >> >> >                  2   3 
> >> >> >                     / \ 
> >> >> >                    4   5 
> >> >> > 
> >> >> > 
> >> >> > How can I achieve this using zippers? 
> >> >> > 
> >> >> > On Wednesday, November 27, 2013 4:30:15 AM UTC, martin_clausen 
> wrote: 
> >> >> >> 
> >> >> >> 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 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 clo...@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+u...@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 a topic in 
> >> >> > the 
> >> >> > Google Groups "Clojure" group. 
> >> >> > To unsubscribe from this topic, visit 
> >> >> > https://groups.google.com/d/topic/clojure/ZTWo5gzOx08/unsubscribe. 
>
> >> >> > To unsubscribe from this group and all its topics, send an email 
> to 
> >> >> > clojure+u...@googlegroups.com. 
> >> >> > For more options, visit https://groups.google.com/groups/opt_out. 
> >> > 
> >> > -- 
> >> > -- 
> >> > You received this message because you are subscribed to the Google 
> >> > Groups "Clojure" group. 
> >> > To post to this group, send email to clo...@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+u...@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 a topic in 
> the 
> >> > Google Groups "Clojure" group. 
> >> > To unsubscribe from this topic, visit 
> >> > https://groups.google.com/d/topic/clojure/ZTWo5gzOx08/unsubscribe. 
> >> > To unsubscribe from this group and all its topics, send an email to 
> >> > clojure+u...@googlegroups.com. 
> >> > For more options, visit https://groups.google.com/groups/opt_out. 
> > 
> > -- 
> > -- 
> > You received this message because you are subscribed to the Google 
> > Groups "Clojure" group. 
> > To post to this group, send email to clo...@googlegroups.com<javascript:> 
> > Note that posts from new members are moderated - please be patient with 
> your 
> > first post. 
> > To unsubscribe from this group, send email to 
> > clojure+u...@googlegroups.com <javascript:> 
> > For more options, visit this group at 
> > http://groups.google.com/group/clojure?hl=en 
> > --- 
> > You received this message because you are subscribed to a topic in the 
> > Google Groups "Clojure" group. 
> > To unsubscribe from this topic, visit 
> > https://groups.google.com/d/topic/clojure/ZTWo5gzOx08/unsubscribe. 
> > To unsubscribe from this group and all its topics, send an email to 
> > clojure+u...@googlegroups.com <javascript:>. 
> > For more options, visit https://groups.google.com/groups/opt_out. 
>

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