分享您的看法,请参与2024 年 Clojure 调查!

欢迎!请参阅关于页面获取更多关于这个工作方式的详细信息。

0
ClojureScript
我们应该能够得到类似于以下警告


cljs.user=> (+ nil 1)
警告:cljs.core/+,所有参数必须是数字,在第 1 行的 clj-nil number(而不是 clj-nil 数字)处出错 <cljs repl>
1


但我们首先需要修复 CLJS-3085。

但是,似乎在 {{cljs.analyzer/numeric-type?}} 中将 {{'clj-nil}} 返回 {{false}} 而不是 {{true}} 这样简单,只需要删除它的 {{cond}} 分支。

6 个回答

0

评论人:roman01la

提交了一个带有测试用例的补丁。

0

评论人:mfikes

当与 CLJS-3085 一起应用时

CLJS-3086.patch 通过了 CI 和 Canary (/)

CLJS-3086.patch 添加到 Patch Tender (i)

0

评论人:mfikes

罗马,

这里有一段有趣的代码,该补丁会触发警告

https://github.com/clojure/clojurescript/blob/c87d61e54fbbeae390e522ba315f0207fb0fed75/src/main/cljs/cljs/spec/alpha.cljc#L264

`
cljs.user=> (s/coll-of any? :kind any? :min-count 1)
警告:cljs.core/+ 要求所有参数必须是数字,但在此行 1 处得到了 [clj-nil number] 的值
警告:cljs.core/+ 要求所有参数必须是数字,但在此行 1 处得到了 [clj-nil number] 的值

对象[cljs.spec.alpha.t_cljs$spec$alpha23729]

`

我还没有深入考虑这个问题,但它提出了一个很好的哲学问题,即如果您有如下代码,这里是否存在类型错误?

(if nil (+ nil 1) 0)

我的最初直觉是,虽然这就像森林里掉落的树,我们可能能够以某种方式解决它,但也许应该纠正那个有毛病的宏。无论如何,我不打算花太多时间纠结于此,至少想与你分享。

0

评论人:mfikes

独立于此票据,我们有一些先例:这会在 1.10.520 版本中触发诊断

`
cljs.user=> (when false (inc false))

                    ^

警告:cljs.core/+ 要求所有参数必须是数字,但在此行 1 处得到了 [boolean number] 的值
nil
`

0

评论人:mfikes

我认为应该修复这个宏。上面显示,尽管您可以从静态上证明某个代码路径不会执行,但仍然会在该路径上的代码触发分析警告。

0
参考资料:https://clojure.atlassian.net/browse/CLJS-3086(由mfikes报告)
...