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

欢迎!请参阅关于页面以获取更多关于此内容的信息。

0
ClojureScript

当扩展记录的协议时,在某些情况下,递归方法永远不会终止。

`
(defrecord R [a])

(defprotocol P
(f [x]))

(extend-protocol P
R
(f [x]

(if x
  (recur nil)
  x))

default
(f [x]

(if x
  (recur nil)
  x)))

(prn (f 1)) ; #1
(prn (f (R. 1))) ; #2
`

{{prn}}调用#1打印{{nil}}符合预期,但{{prn}}调用#2永远不会终止。

看起来编译器在while循环内部为一个分配了{{this}}的变量,使得对{{x}}的测试实际上始终是对{{this}}的测试,而应该是测试由{{recur}}调用传入的{{x}}的值。

请注意,我正在测试ClojureScript 1.8.51。上面“影响版本”字段仅给出最接近的版本1.7.228。

3 个答案

0

评论由:bstiles发表

实际上,“本来应该测试x的值,但实际测试的是'this'”只有在x所代表的值的类型保持不变时才成立。如果在例如示例中类型发生变化,调用应该分配给正确匹配的方法实现。

这看起来在Clojure中表现如预期。

0

评论由:dnolen发表

与Mike Fikes确认,即使在recur增强后,这仍然是master上的一个问题。

0
参考: https://clojure.atlassian.net/browse/CLJS-1644(由 alex+import 提出)
...