make-node в библиотеке молний - PullRequest
2 голосов
/ 03 октября 2011

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

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.Я не понимаю, когда и где этот параметр будет использоваться.

1 Ответ

2 голосов
/ 03 октября 2011

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

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

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

...