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 produces

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

嗨Alex,我打算附上一个独立补丁,其中包含上述建议的docstring调整方案(今晚会做)。代码本身没有变化,而且我觉得没有必要分配这个工单 - 很抱歉造成不必要的打扰。
0

评论由:alexmiller

没关系,只是想确认是否还有待处理的事情 - 我会等待预审。

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