当扩展记录的协议时,在某些情况下,递归方法永远不会终止。
`
(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。