某些应该工作的模式匹配表达式失败,因为这些动态变量 `**locals**
` 未绑定。例如
(matche
(link: x)
((link: '(~a))))
在宏展开期间出现错误,表示 contains?
无法应用于未绑定的变量
编译器异常 java.long.IllegalArgumentException: contains? 不支持类型:clojure.lang.Var$Unbound
(引用的 contains? 调用位于 lvar-sym? 中,我们检查在模式中出现的变量是否已经是一个局部变量。)
我相信这是正在发生的事情
- 在
p->term
的两个地方,我们调用 map
来递归地应用 p->term 到子模式上:例如 (map #(p->term % vars quoted) p)
。
map
返回一个 LazySeq。
- 在 LazySeq 的元素实际上被强制执行(这发生在宏展开期间)时,动态 locals 变量不再绑定。
一个可能的解决方案是 将 `doall ...` 包围在上述两个 `map` 调用中(logic.clj 中的第 1523 行和 1529 行)。