2024年Clojure调查中分享你的想法!

欢迎!请参阅关于页面以了解有关此工具更详细的信息。

+6
Clojure

clojure.walk中的条件调度速度慢,且不支持扩展。在CLJ-1105之前,它不支持记录。

方法: 使用协议重新实现clojure.walk。公共API没有变化。用户可以根据需要扩展{{walk}}协议到其他类型(例如Java集合)。与CLJ-1105一样,这个版本的clojure.walk支持记录。

补丁: 0002-CLJ-1239-protocol-dispatch-for-clojure.walk.patch

性能: 我的测试表明,这比原始的clojure.walk快1.5x-2x。请参阅https://github.com/stuartsierra/clojure.walk2以获取基准测试。

风险: 这种方法可能存在破坏依赖于旧clojure.walk类型特定行为的用户代码的风险。当运行完整的Clojure测试套件时,我发现(并修复)了一些在clojure.walk单元测试中没有显示出来的破坏。例如,请参阅(链接:https://github.com/stuartsierra/clojure.walk2/commit/730eb756dcc424aa535d0872bd626079955c3892 文本:clojure.walk2中的730eb75提交)。

10 答案

0

评论由:vmarcinko发表

看起来,目前遍历树并替换表单不会保留数据结构中包含的元数据。

0

评论由:jafingerhut发表

补丁0001-CLJ-1239-protocol-dispatch-for-clojure.walk.patch自2013年11月22日提交CLJ-1105修补程序以来不再干净地应用于最新的Clojure master。根据描述,似乎意图是此修补程序或该修补程序,而不是两者,因此我无法确定应如何处理此修补程序,甚至此票据。

0

评论人:alexmiller

此补丁和条目仍然可以用于未来的发布。

0

评论人:stuart.sierra

添加了新的补丁,该补丁在CLJ-1105之后应用于最新的master。

0
_评论人:[email protected]_

与常规映射相比,此补丁的行为可能令人惊讶。


(clojure.walk/prewalk-replace {[:a 1] nil} {:a 1, :b 2})
;=> {:b 2}

(defrecord Foo [a b])
(clojure.walk/prewalk-replace {[:a 1] nil} (map->Foo {:a 1, :b 2}))
;=> #user.Foo{:a 1, :b 2}


请注意,从映射中移除了{{[:a 1]}}条目,但未从记录中移除。

这是一个不受此问题影响的实现,尽管它执行了令人胆寒的类名更改: https://github.com/LonoCloud/synthread/blob/a315f861e04fd33ba5398adf6b5e75579d18ce4c/src/lonocloud/synthread/impl.clj#L66

我们或许可以在defrecord抽象中添加对像synthread代码那样笨拙的事情的支持,然后让walk利用它。
0

评论人:alexmiller

@Chouser,您可以为此提出一个新的票证吗?从已关闭的条目的评论中管理对某项工作的努力是非常困难的。

0

评论人:alexmiller

@Chouser - 没关系!我在想这是进入1.6的更改。继续吧。 :)

0

评论人:bronsa

Alex,对于此事而言,clojure-1.6.0在CLJ-1105之后表现出了与Chouser所描述的此补丁相同的行为。

0

评论作者:glts

当前 clojure.walk 的实现没有保留元数据。

如果将来重新审查这个新实现,最好也在可能的情况下保留元素上的元数据。

0
参考:[https://clojure.atlassian.net/browse/CLJ-1239](https://clojure.atlassian.net/browse/CLJ-1239)(由 stuart.sierra 报告)
...