cljs.core/-prefer-method中的冲突测试似乎正向错误,如果在ACLJ中一致多次使用prefer-method(例如在REPL中重新加载代码)则会导致错误。
以下是问题的一个最小化示例。虽然这里的层次和方法很 trivial,但是在prefer-method真正解决的问题中有真正的模糊时也会发生相同的问题。请注意,消息表明相对于prefer-method的文档偏好顺序相反。(在这里,我们希望 :a 比 :b 偏好,但消息表明相反。)
(def tmph (make-hierarchy))
(defmulti fooz (fn [a b] (keyword b)) :hierarchy #'tmph)
(defmethod fooz :a [a b] a)
(defmethod fooz :b [a b] b)
(prefer-method fooz :a :b)
;=> {:parents {}, :descendants {}, :ancestors {}}
(prefer-method fooz :a :b)
;;
;; Execution error (Error) at (<cljs repl>:1).
;; Preference conflict in multimethod 'cljs.user/fooz': :b is already preferred to :a
;; :repl/exception!
使用ClojureScript 1.10.914运行 clj -M -m cljs.main --repl-env node
,在干净的安装中,使用从master构建的uberjar(当时)。
问题似乎是由于prefer*的前两个参数在(MultiFn的)定义中是反向的。
(when (prefers* dispatch-val-x dispatch-val-y prefer-table)
(throw (js/Error. (str "Preference conflict in multimethod '" name "': " dispatch-val-y
" is already preferred to " dispatch-val-x))))
(第11356行 core.cljs 在MultiFn的定义中)。在这里调用时,应该使x比y更偏好,这应该是连续的。
谢谢!