Я создаю деревья s-выражений для проблемы генетического программирования, и мне нужно изменить части деревьев в процессе эволюции.Я столкнулся с функцией Clojure zipper , которая кажется идеальной, но я не могу понять, как ее использовать.
Например, скажем, я создаюмолния с
(def zipped (zip/seq-zip `(+ (- 1 2) 3)))
Я понимаю, что это представляет дерево с + в корне, которое выглядит так:
+
- 3
1 2
Моя молния, однако, не согласна сthis: если я запрашиваю первый узел с (-> zipped zip/down zip/node)
, он дает мне +
(что правильно), но (-> zipped zip/down zip/down)
не приводит меня к -
, вместо этого он возвращает nil
.Действительно, (-> zipped zip/down zip/rights)
дает остальную часть дерева как братьев и сестер справа от корня, что говорит мне о том, что у меня вообще нет дерева:
user> (-> zipped zip/down zip/rights)
((clojure.core/- 1 2) 3)
Я уверен, что яЯ правильно представляю свои деревья, потому что когда я их выполняю, я получаю правильный ответ.Молния ожидает другого макета?