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.