欢迎!有关如何工作的更多信息,请参阅关于页面。
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)
评论者:vmarcinko
看起来,现在在遍历树和替换形式时不会保留数据结构中包含的原始元数据。
评论者:jafingerhut
自2013年11月22日提交对CLJ-1105的补丁以来,补丁0001-CLJ-1239-protocol-dispatch-for-clojure.walk.patch不再适用于最新的Clojure大师。根据描述,意图是这两个补丁中的任何一个,而不是两个,因此我不确定应该对这个补丁或甚至这个票据做什么。
评论者:alexmiller
此补丁和票据仍然是未来版本候选。
评论者:stuart.sierra
添加了新的补丁,在CLJ-1105后应用于最新的master。
@Chouser,您可以为此创建一个新的票据吗?从一个已关闭的票据的评论中管理对某项工作的处理很困难。
@Chouser - Never mind! I was thinking this was the change that went into 1.6. Carry on. :)
评论者:bronsa
Alex,如果这很重要,clojure-1.6.0在CLJ-1105之后表现出与Chouser为此补丁描述的相同行为
评论者:glts
clojure.walk的实现目前不保留元数据。
如果将来有重新审视这个新实现的可能,那么最好也能尽可能保留元素上的元数据。