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.5倍-2倍。有关基准测试,请参阅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大师。根据描述,意图是这两个补丁中的任何一个,而不是两个,因此我不确定应该对这个补丁或甚至这个票据做什么。

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}


注意如何在map中从{{[:a 1]}}条目中删除它,但没有从record中删除它。

这是一个不会受到该问题的困扰的实现,尽管它会对类名进行吓人的模糊处理:https://github.com/LonoCloud/synthread/blob/a315f861e04fd33ba5398adf6b5e75579d18ce4c/src/lonocloud/synthread/impl.clj#L66

也许我们可以向defrecord抽象中添加一些内容,以更好地支持synthread代码笨拙做的事情,然后{{walk}}可以利用这一点。
0

评论者:alexmiller

@Chouser,您可以为此创建一个新的票据吗?从一个已关闭的票据的评论中管理对某项工作的处理很困难。

0

评论者:alexmiller

@Chouser - Never mind! I was thinking this was the change that went into 1.6. Carry on. :)

0

评论者:bronsa

Alex,如果这很重要,clojure-1.6.0在CLJ-1105之后表现出与Chouser为此补丁描述的相同行为

0

评论者:glts

clojure.walk的实现目前不保留元数据。

如果将来有重新审视这个新实现的可能,那么最好也能尽可能保留元素上的元数据。

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