2024 Clojure状态调查中分享您的想法!

欢迎!请参阅关于页面以了解更多有关此网站的信息。

+1

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更偏好,这应该是连续的。

谢谢!

1 答案

...