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