2024 Clojure状态调查!(State of Clojure Survey)中分享您的想法!

欢迎!请查看关于页面获取关于这个工作的一些更多信息。

0
ClojureScript

如果一个函数在自己的主体内部递归地调用自身,则不会检查参数数量不匹配。

5 个回答

0

评论由:kamn 提出

花了一些时间来查看这个问题。最初认为“像 loop/recur 那样做”,但这并没有考虑到多参数。似乎最好的选择是使用 analyze(analyze-fn-methods-pass2) 的第二次遍历。函数的所有信息都存在,并且代码的警告部分被触发,但由于已经关闭警告,所以被忽略。其他任何解决这个问题的想法吗?

0

评论由:kamn 提出

所以我想对这个补丁提供反馈,并且我会尝试解释每个部分的推理。

问题是,一个函数只有在第一次被解析之后才知道它的参数数量。
因此,我们需要在第二次遍历中检查参数数量问题。

首先,添加了两个新变量。
-activate-second-pass-warnings:布尔值基本上,如果您想开启二次遍历警报
-second-pass-cljs-warnings:集合现在我们只有 :fn-arity,但我认为最好使其通用。

因此,首先修改 analyze-fn-methods-pass2 函数。
在这里使用 no-warn 标记而不是一些新功能。
目标是关闭所有内容,除了二次遍历警报。

因此,如果 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 提交)
...