一些应该工作的模式匹配表达式失败了,因为动态变量 **locals** 未绑定。例如:
(matche
(link: x)
((link: '(~a))))
在宏扩展期间会出错,错误提示 contains? 无法应用于未绑定的变量
编译器异常 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 行)。