问题由 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)))))
结果是
(() 0)
()
nil
0
:done
我不期望那里有 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。预计即将提供补丁。