Clojure 2024 调查问卷!中分享您的观点。

欢迎!请参阅关于页面了解其工作原理的更多信息。

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

结果是

(() 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,我原本想要附一个独立的补丁,提出关于文档字符串调整的建议(今晚我会这么做)。不过代码没有改变,我认为不需要分配这个工单 - 非常抱歉造成不必要的提醒。
0

评论由: alexmiller_ 提供

没关系,我只是想知道还有什么悬而未决的事情 - 我会等待预审。

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