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

自 2013 年 11 月 22 日提交 CLJ-1105 补丁以来,补丁 0001-CLJ-1239-protocol-dispatch-for-clojure.walk.patch 已不再干净地适用于最新的 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

亚历克斯,就 clojure-1.6.0 在 CLJ-1105 之后的表现而言,与 Chouser 对此补丁的描述相同。

0

评论者:glts

clojure.walk 当前实现在元素上不保留元数据。

如果以后再审视这个新实现,还要尽可能保留元素上的元数据。

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