问题由Lee Spector在邮件列表上报告
https://groups.google.com/d/msg/clojure/8TL7IGmE7N0/u1xfgTOLDRgJ
以下是Lee帖文中描述问题的引述
`
以下是一个示例,逐步通过 '(() 0) 使用next并在每个步骤中打印节点
(loop [z (zip/seq-zip '(() 0))]
(if (zip/end? z)
:done
(do (println (zip/node z))
(recur (zip/next z)))))
产生了
(() 0)
()
nil
0
:done
我不期望那里有nil。
`
根本原因在于{{seq-zip}}将{{identity}}作为{{children}}参数传递给{{zipper}}。应用于{{()}}, 这返回{{()}}, 这是一个真值,导致{{zipper}}进入一个不存在的子树。
一个自然的解决方案是在{{identity}}的替代中使用{{seq}}
`
(defn seq-zip [root]
(zipper seq?
seq ;; changed
(fn [node children] (with-meta children (meta node)))
root))
`
通过这个改变,上面的例子中没有产生任何{{nil}}。将这个改变作为一个补丁来应用。