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

欢迎!请查看 关于页面 以获取更多关于此工作方式的信息。

0
ClojureScript
编辑
  1. cljs.core/prefers* 中想知道这些两个循环。我是不是理解错了,它们是否总是返回 nil?看起来内层 when 的结果,即调用 prefers* 的递归调用,总是被丢弃。

  2. 此外,如果这两个循环的意图是对 prefers 表的多态查找,那么调用 parents 是否也应该像 cljs.core/dominates 中的 isa? 一样,针对相同的 hierarchy?目前它们是对全局层次结构做出的。

  3. 此外,如果没有 prefers 表或它是空的,您可能可以跳过这些循环。

1 答案

0

我怀疑这段代码可能来源于 MultiFn 中的 Clojure 代码,那里有一个与层次结构相关的错误(并在 1.11 中修复 - 见 https://clojure.atlassian.net/browse/CLJ-2234 )。

感谢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
...