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

产生了

(() 0)
()
nil
0
:done

我不期望那里有nil。
`

根本原因在于{{seq-zip}}将{{identity}}作为{{children}}参数传递给{{zipper}}。应用于{{()}}, 这返回{{()}}, 这是一个真值,导致{{zipper}}进入一个不存在的子树。

一个自然的解决方案是在{{identity}}的替代中使用{{seq}}

`
(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_

米哈伊尔,能否问一下你为什么给自己分配了这个任务——你有什么打算添加的吗?
0
_评论者:michalmarczyk_

嗨亚历克斯,我本来想附加一个单独的补丁,提出对上述建议的文档字符串进行调整(今晚会这么做)。但是代码没有改动,我觉得没有必要分配这个工单——很抱歉造成不必要的打扰。
0

评论者:alexmiller

没关系,只是想知道还有没有待处理的事——我会等待预筛选。

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