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

欢迎!请参阅 关于 页面以获取更多关于此如何工作的信息。

0 投票
ClojureScript
我们应该能够获得一个警告,例如


cljs.user=> (+ nil 1)
警告:cljs.core/+, 所有参数都必须是数字,但是 line 1 <cljs repl> 位置获得了 [clj-nil number]
1


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

但是有了这个,这看起来就像是将 {{cljs.analyzer/numeric-type?}} 返回 false 而不是 true 当对 {{'clj-nil}} 进行操作,只需要删除它的 {{cond}} 分支。

6 答案

0 投票

由 roman01la 写的评论

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

0 投票

由 mfikes 写的评论

在应用 CLJS-3085 后

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

CLJS-3086.patch 已添加到补丁传递者 (i)

0 投票

由 mfikes 写的评论

嗨,Roman,

这里是触发此补丁后警告的一段有趣的代码片段,这段代码位于标准库中

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/+, 所有参数都必须是数字,但是 line 1 位置获得了 [clj-nil number]
警告:cljs.core/+, 所有参数都必须是数字,但是 line 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获得[布尔类型 数字]
nil
`

0 投票

由 mfikes 写的评论

我认为应该修复这个宏。上面的例子表明,尽管你可以静态地证明某个代码路径没有被采取,但分析警告会在该路径上启动。

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