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

产生

(() 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报告)
...