make-node в библиотеке zipper

Я пытаюсь создать молнию из собственной карты. Согласно определению молнии,

Usage: (zipper branch? children make-node root)

ветка параметров? и дети ясны, и я могу определить это. Но функция make-node сбивает с толку. Я дал ему реализацию, которая, я не думаю, используется.

у меня есть карта г.

{:question "Question 1" :yes "Answer1" 
                        :no {:question "Question 2"
                             :yes "Answer2"
                             :no "Answer3"}}

Я хочу построить молнию из этой карты. Поэтому я использовал следующий вызов функции застежки-молнии:

(zip/zipper map? 
    (fn [node] [(:yes node) (:no node)]) 
    (fn [node children] (:question node)) 
    question-bank)

Это прекрасно работает. Это работает, даже если указать параметр make-node nil. Я не понимаю, когда и где этот параметр будет использоваться.


person Udayakumar Rayala    schedule 03.10.2011    source источник


Ответы (1)


Молнии позволяют модифицировать дерево, а также просто ходить по нему. Функция make-node будет вызываться, если вы попытаетесь добавить новый узел в дерево или изменить существующий узел. Это немного странно, потому что ваша застежка-молния вообще не раскрывает элемент :question, но я мог бы написать вашу застежку-молнию как:

(zip/zipper map? (juxt :yes :no) 
                 (fn [_ [yes no]] {:yes yes :no no}) 
                 root)

Лично я не использую застежки-молнии, так что, вероятно, это неправильная реализация; Я просто надеюсь проиллюстрировать, что функция make-node должна использоваться для создания новых узлов для прикрепления к застежке-молнии.

person amalloy    schedule 03.10.2011