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