2024 Clojure状态调查!分享你的想法。

欢迎!请访问关于页面获取更多关于其如何工作的信息。

+2
多方法
已关闭
请参阅https://groups.google.com/forum/#!topic/clojure/3nMn6TiBGOg,该处尚未有任何回复。

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

假设prefer-method在局部和全局层次结构中应表现相同,以下有两个单元测试。
MultiFn-prefers-with-local-hierarchy因“多个方法”的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)]
      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报告)
...