2024 年 Clojure 状态调查! 中分享您的想法。

欢迎!请参阅 关于 页面以了解如何运行的更多信息。

+2 投票
多方法
关闭
请参阅 https://groups.google.com/forum/#!topic/clojure/3nMn6TiBGOg, 这里没有收到任何回复。

prefers(x,y) 通过调用 parents.invoke() 递归地访问祖先。
这将遍历全局层次结构中的父类,而不是多方法的层次结构。
这是预期的行为吗?为什么会这样?

基于 prefer-method 应该对局部和全局层次结构行为相同的前提,以下是两个单元测试。
MultiFn-prefers-with-local-hierarchy 由于抛出 "Multiple methods" IllegalArgumentException 而失败。
MultiFn-prefers-with-global-hierarchy 成功。

(test/deftest MultiFn-prefers-with-local-hierarchy
  (def local-hierarchy
    (let [h (make-hierarchy)
          h (derive h ::c0 ::b0)
          h (derive h ::d0 ::c0)
          h (derive h ::d0 ::a0)]
     nbsp;h))
  (defmulti local identity :hierarchy #'local-hierarchy)
  (defmethod local ::a0 [x] [::a0 x])
  (defmethod local ::c0 [x] [::c0 x])
  (prefer-method local ::b0 ::a0)
  (test/is (= [::c0 ::d0] (local ::d0)))))

(test/deftest MultiFn-prefers-with-global-hierarchy
  (derive ::c1 ::b1)
  (derive ::d1 ::c1)
  (derive ::d1 ::a1)
  (defmulti global identity)
  (defmethod global ::a1 [x] [::a1 x])
  (defmethod global ::c1 [x] [::c1 x])
  (prefer-method global ::b1 ::a1)
  (test/is (= [::c1 ::d1] (global ::d1))))

如果这确实是不对的,修复是相当简单的。一旦确认这是一个真正的问题,我将提交一个补丁。
带有注释关闭: 在 1.11.0-alpha4 中发布

3 答案

0 投票

评论者为:alexmiller

欢迎提交补丁

你好,Alex,

我几年前提了一个补丁,在https://clojure.atlassian.net/browse/CLJ-2234, 如何才能考虑这个补丁?我很乐意做出任何你想要的变化。
我们根据投票数量评定优先级,所以这个目前排在很后面。
0 投票

评论者为:palisades-lakes

我不太确定对preferMethod的修改。
我已经把resetCache移到了开始,这样
perfers()就可以调用层次结构的当前状态。由于我们处于写入锁中,我认为再次调用它是不必要的。

0 投票
参考:https://clojure.atlassian.net/browse/CLJ-2234 (由palisades-lakes报告)
...