感谢Alex的回复和原始来源的链接。根据Java代码,我的三个问题的答案似乎都是'是'。是否应该将这些问题作为ClojureScript项目的错误提交报告?
但我认为我可能在Java(和CLJS)实现中看到了更多的问题。
1. `isa?`是一个与数据类型无关的多态比较:向量以位置方式处理。对于`prefers`,多态性取决于数据类型。向量不以位置方式处理,并且对向量调用`parents`始终返回`nil`。
2. 在[L88][1] `preferMethod`确保表中没有重复的`prefers`。但对于当前`prefers`的实现,交换`x`和`y`是不够的。如果你首先对一个较低层级的关联进行偏好设置,然后对一个较高层级的冲突进行偏好设置,你不会得到错误。但如果你反转操作顺序,你会得到错误。
(def h
(-> (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)位于user/eval137582(REPL:244)。
在多方法'm2'中存在偏好冲突::user/a已偏好于:user/b
[1]
https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/MultiFn.java#L88