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

欢迎!有关如何工作的更多信息,请参阅关于页面。

0
ClojureScript

如果一个函数在其自身体内部递归地调用自己,则将不会检查调用与arity不匹配。

5 个答案

0

评论者:kamn

花了一些时间来查看这个问题。最初认为“做 loop/recur 做的同样事情”,但是没有考虑到多arity。这似乎可能是最好的方法,通过某种方式使用 analyze(analyze-fn-methods-pass2) 的第二次遍历。关于函数的所有信息都存在,并且代码的警告部分被触发,但是因为没有-warn 被忽略。您还有其他任何关于此问题解决方案的想法吗?

0

评论者:kamn

所以我在寻找对这个补丁的反馈,并尝试解释每个部分的推理。

问题是函数只有在其被解析一次之后才知道它的 arity。
所以我们需要在第二次遍历中检查 arity 问题

首先,添加了两个新的变量。
-activate-second-pass-warnings:布尔型。如果您希望启用第二次遍历的警告
-second-pass-cljs-warnings:集合。目前我们只有 :fn-arity,但我想应该让它通用。

所以首先是对 analyze-fn-methods-pass2 函数的修改。
在这里不使用 no-warn marco,而是有一些新的功能。
目标是将所有内容除第二次遍历警告之外都关闭

所以如果 activate-second-pass-warnings 是 false,则仅使用 no-warn,否则它将使用新的代码部分。

默认警告处理程序也被修改了。在检查警告是否存在之后,它会检查该警告是否是第二次遍历警告,并
现在是否可以激活。如果 activate-second-pass-warnings 为 false,并且警告仍然存在,这表示它是一个第二次遍历警告
因此我们激活它。

我还试图保持所有修改都在 cljs.analyzer 中。

最初,我将 cljs-warnings :fn-arity 设置为 false,它只会在第二次遍历时打开。
然而,repl 部分只是将所有内容设置为 true(并关闭选择的部分,如 ns 错误)。
因此我决定不修改这些部分,而是保持其他文件与分析器的接口相同。

0

评论者:kamn

刚刚意识到我标记的补丁是 .md 而不是 .patch :P

0

评论文本:mfikes

补丁不再适用。

0
参考:https://clojure.atlassian.net/browse/CLJS-868(由 dnolen 报告)
...