在< используете ваши мысли в Clojure 2024调查中!

欢迎!请参阅关于页面以获取更多关于本页功能的信息。

0
ClojureScript

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

5 答案

0

评论者:kamn

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

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,否则它会使用新的代码部分。

default-warning-handler 也被修改了。在检查警告是否打开后,它会检查警告是否是第二次遍历的警告
如果现在可以激活那个警告。如果 activate-second-pass-warnings 为 false 并且仍然存在警告,则意味着它是一个第二次遍历警告
在第二次遍历中,所以我们激活它。

我还尽量在 cljs.analyzer 中进行所有修改。

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

0
by

评论者:kamn

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

0
by

评论者:mfikes

补丁不再适用。

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