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

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

0
core.logic

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

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

在宏展开期间出现错误,表示 contains? 无法应用于未绑定的变量

编译器异常 java.long.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 变量不再绑定。

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

2 答案

0

评论由:alexlew 提供

我为上面的格式不好表示歉意!我是 JIRA 新手(并且找不到编辑按钮)。

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