2024 Clojure 状态调查! 中分享您的想法。

欢迎!有关此功能的更多信息,请参阅关于页面

0
core.logic

一些应该工作的模式匹配表达式失败了,因为动态变量 **locals** 未绑定。例如:

(matche
(link: x)
((link: '(~a))))

在宏扩展期间会出错,错误提示 contains? 无法应用于未绑定的变量

编译器异常 java.lang.IllegalArgumentException: contains? 不支持类型:clojure.lang.Var$Unbound

(引用的 contains? 调用位于 lvar-sym? 中,我们检查是否一个在模式中出现的变量已经是一个局部变量。)

我认为这是发生的原因

  1. 在 `p->term` 的两个地方,我们调用 `map` 来递归地将 p->term 应用到子模式上:例如,`(map #(p->term % vars quoted) p)`。
  2. `map` 返回一个 LazySeq。
  3. 当 LazySeq 的元素真正被强制执行(这在宏扩展期间发生)时,动态的 locals 变量已不再绑定。

一个可能的解决方案是将两个 `map` 调用之上的 `(doall ...)` 包围起来(在 logic.clj 的第 1523 行和 1529 行)。

2 个答案

0

评论由:alexlew 提供

对于上方的糟糕格式,我表示歉意!我是 JIRA 新手(并且找不到编辑按钮)。

0
参考:https://clojure.atlassian.net/browse/LOGIC-187(由 alex+import 报告)
...