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

欢迎!请参阅 关于 页面了解有关此服务的工作方式的一些更多信息。

0 投票
core.logic

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

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

在宏展开期间产生错误,错误的 `contains?` 无法应用于未绑定的变量

CompilerException 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 报告)
...