2024 Clojure 状态调查! 分享您的想法。

欢迎!请参阅 关于 页面以了解更多关于如何使用本站的信息。

0
Clojure

由 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))))) 

That 产生

(() 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}}。包含此更改的补丁即将推出。

5 个答案

0

评论由:michalmarczyk 提供

请注意,{{clojure.zip/zipper}} 的文档字符串要求 {{children}} 参数返回一个子元素序列。然而,{{clojure.zip}} 的其余部分在没有任何子元素时预期返回 {{nil}},正如这个问题所证明的那样。

有人可能会说,{{clojure.zip}} 的其余部分的行为应该得到修复,但我认为这是合理的且方便的。也许文档字符串应该修改。

0
_评论由:alexmiller 提供

Michał,我可以问一下你为什么把这个任务分配给自己 - 是不是有什么你打算添加的?
0
评论由:michalmarczyk 制作

Hey Alex,我打算附上一个单独的补丁来提出对docstring的调整建议(今晚会做)。但代码没有任何改变,所以我猜这个任务不值得分配——很抱歉造成不必要的打扰。
0

评论由:alexmiller

没关系,只是想确认还有没有悬而未决的事——我会等待预审。

0
参考:[https://clojure.atlassian.net/browse/CLJ-1317](https://clojure.atlassian.net/browse/CLJ-1317)(由michalmarczyk报告)
...