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