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

欢迎!有关如何工作的更多信息,请参阅 关于 页面。

0
Clojure

由 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}}。这个更改的补丁即将推出。

5 个答案

0

评论者:michalmarczyk

请注意,{{clojure.zip/zipper}} 的文档字符串要求 {{children}} 参数返回子节点的序列。然而,{{clojure.zip}} 的其余部分,正如这个问题的证据所指出的,在没有子节点的情况下返回 {{nil}}

人们可以争论,{{clojure.zip}} 的其余部分的这种行为应该得到修复,但我认为这是合理的,也很方便。也许应该调整文档字符串。

0
_ 评论者:alexmiller_

Michał,我可以问问你为什么把它分配给自己——有你需要添加什么吗?
0
_评论由:michalmarczyk_发表

嗨Alex,我本想附上一份单独的补丁,其中包含对以上建议的文档字符串调整的建议(将在今晚完成)。不过,代码没有任何改动,猜测也不值得分配工单 - 非常抱歉给您造成不必要的工作。
0

评论由:alexmiller

没关系,只是想了解一下是否还有待决事项 - 我会等待预处理。

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