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