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

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

0
ClojureScript

如果一个函数在其主体内递归调用自身,此调用将不会被检查参数不匹配。

5 个回答

0

评论由:kamn 添加

花费了一些时间来研究这个问题。最初认为“做 loop/recur 所做的”,但这不考虑多参数。似乎最好的选择是 somehow 使用 analyze(analyze-fn-methods-pass2) 的第二次遍历。有关函数的全部信息都存在,并触发了代码的警告部分,但由于 no-warn 被忽略。对于这个问题的解决方案还有什么其他想法吗?

0

评论由:kamn 添加

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

问题是,函数只知道自己的参数性在它被解析一次之后。
因此我们需要在第二次遍历时检查参数问题

首先,添加了两个新变量。
- 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 是假,并且仍然存在警告,则意味着它是第二次遍历警告。
在第二次遍历时,我们将其激活。

我还尝试保留所有修改在 cljs.analyzer 中。

最初,我将 cljs-warnings :fn-arity 设置为假,它只在第二次遍历时才会被启用。
但是,repl部分将所有设置都设置为真,并关闭了选择部分,例如命名空间错误。
因此,我决定不修改这些部分,而是保持其他文件与分析器接口相同。

0
by

评论由:kamn 添加

刚刚发现我把补丁标记为 .md 而不是 .patch :P

0
by

评论者:mfikes

补丁不再适用。

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