感谢Alex的回答和指向原始来源的链接。根据Java代码,我的三个问题的答案似乎是'是'。这些应该作为bugs提交给Clojurescript项目吗?
但我认为我在Java(和CLJS)实现中可能还发现了更多问题。
1. `isa?`是一个与数据类型无关的多态比较:向量通过位置处理。对于`prefers`,多态取决于数据类型。向量不通过位置处理,并且对向量调用`parents`总是返回`nil`。
2. 在[L88][1]中,`preferMethod`确保表中没有重复的`prefers`。但对于`prefers`的当前实现,交换`x`和`y`是不够的。如果你首先倾向于晶格中较低的关系,然后是晶格中较高的冲突倾向于,你不会得到错误。颠倒操作顺序你就得到了错误。
(-> (make-hierarchy)
(derive ::a ::b)
(derive ::b ::c)
(derive ::a ::d)
(derive ::d ::e)))
;; 不捕获冲突
(defmulti m1 identity :hierarchy #'h)
(prefer-method m1 ::b ::a)
(prefer-method m1 ::d ::b)
#'user/m1
;; 交换prefers的顺序捕获冲突
(defmulti m2 identity :hierarchy #'h)
(prefer-method m2 ::d ::b)
(prefer-method m2 ::b ::a)
执行错误(IllegalStateException)在用户/eval137582(REPL:244)。
在多方法'm2'中存在偏好冲突::user/a已经偏好于:user/b
[1]
https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/MultiFn.java#L88