2024 Clojure 状况调查分享你的想法!

欢迎!请参阅关于页面以了解更多关于如何使用本网站的信息。

0
ClojureScript

如果一个函数在其自身体内部递归调用自身,则不会检查参数数量是否匹配。

5 答案

0

评论人:kamn

花了一些时间来查看这个问题。最初认为“做 loop/recur做的事”,但这个方法没有考虑到多参数(arity)。似乎最好的方法是在分析(analyze-analyze-fn-methods-pass2)的第二遍中使用某种方法。整个关于函数的信息都存在,代码中的警告部分会被触发,但由于存在no-warn而忽略。还有其他关于解决方案的想法吗?

0

评论人:kamn

因此,我希望得到对这个补丁的反馈,并且我将尝试解释每个部分的理由。

问题是函数只有在解析过一次之后才了解它的参数数量。
因此,在第二遍检查参数数量问题时进行检查

首先添加了两个新变量。
-activate-second-pass-warnings:Boolean 如果你想开启第二遍的警告
-second-pass-cljs-warnings:Set 目前我们只有:fn-arity,但我认为最好使它更通用。

所以首先修改了analyze-fn-methods-pass2函数。
在此不再使用no-warn宏,而是有一些新功能。
目标是关闭除第二遍警告之外的全部功能

所以如果activate-second-pass-warnings为false,则使用no-warn,否则将使用新代码段。

还修改了default-warning-handler。在检查是否有警告之后,它会检查该警告是否为第二遍警告,
如果现在可以激活该警告。如果 activate-second-pass-warnings 为 false 并且仍然存在警告,则表示这是一个第二次遍历的警告。
在第二次遍历中,因此我们激活它。

此外,我尽量保持所有修改都在 cljs.analyzer 中。

最初,我将 cljs-warnings :fn-arity 设置为 false,它将在第二次遍历中才启用。
然而,REPL 部分将所有内容都设置为 true(并关闭了部分选择,如 ns 错误)。
因此,我决定不修改这些部分,而是保持其他文件与分析器接口一致。

0

评论人:kamn

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

0

评论者:mfikes

补丁不再适用。

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