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移动到开头,以便
perf()能够在当前层次结构的当前状态下调用。由于我们在写锁中,我认为再次调用它是不必要的。

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