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