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 代码,该代码存在层次结构上的 bug(并在 1.11 中修复,见 https://clojure.atlassian.net/browse/CLJ-2234 )。

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