Как мне отформатировать дерево, чтобы оно работало с молнией Clojure? - PullRequest
3 голосов
/ 11 октября 2010

Я создаю деревья 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)

Я уверен, что яЯ правильно представляю свои деревья, потому что когда я их выполняю, я получаю правильный ответ.Молния ожидает другого макета?

Ответы [ 2 ]

3 голосов
/ 11 октября 2010

Проблема в том, что здесь существуют две разные идеи дерева. Ваше дерево представляет собой график того, как значения просачиваются через оценку, но LISP думает о списках списков и использует префиксную нотацию:

'(+ (- 1 2) 3) также (list + (list - 1 2) 3), что на самом деле является этим деревом:

+  .     3
   - 1 2

(-> zipped down node) дает вам первый элемент, +, атом. (-> zipped down down), таким образом, дает вам ноль, потому что первый элемент, +, является атомом. (-> zipped down right down node) дает вам нужный знак минус, потому что это первый элемент второго элемента выражения.

1 голос
/ 11 октября 2010

Дерево не так, как вы его изобразили. Корневой узел имеет 3 дочерних элемента: +, (- 1 2) и 3. Когда вы делаете down из корневого узла, по умолчанию используется самый левый потомок, поэтому вы видите +.

Чтобы добраться до -, вам нужно позвонить:

user=> (-> zipped zip/down zip/right zip/down zip/node)
clojure.core/-
...