某些应该工作的模式匹配表达式失败了,因为动态变量 `**locals**
` 未绑定。例如
(matche
(link: x)
((link: '(~a))))
在宏展开期间产生错误,错误的 `contains?
` 无法应用于未绑定的变量
CompilerException java.lang.IllegalArgumentException: contains? 不支持类型:clojure.lang.Var$Unbound
(引用的 contains? 调用位于 lvar-sym?,我们在其中检查一个变量是否在模式中已经是局部变量。)
我认为这是发生的情况
- 在
p->term
的两个位置,我们调用 map
对子模式递归应用 p->term:(map #(p->term % vars quoted) p)
,例如。
map
返回一个 LazySeq。
- 等到 LazySeq 的元素被实际强制求解(这发生在宏展开期间),动态强 locals 变量不再绑定。
可能的一个解决方案是在上面提到的两个 map
调用周围包裹一个 `(doall ...)
`(在 logic.clj 的第 1523 行和第 1529 行)。