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

欢迎!请查看关于页面获取更多信息。

0
ClojureScript
我们应该能收到类似警告:


cljs.user=> (+ nil 1)
WARNING: cljs.core/+, 所有参数必须是数字,在行1处获得 [clj-nil number],而不是 [数字] <cljs repl>
1


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

但有了这个,将 {{cljs.analyzer/numeric-type?}} 返回 {{false}} 而不是为 {{'clj-nil'}} 返回 {{true}} 就像删除它的 {{cond}} 分支一样,似乎很简单。

6 答案

0

评论者:roman01la

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

0

评论者:mfikes

当与CLJS-3085一起应用时

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

CLJS-3086.patch添加到补丁堤 (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)
WARNING: cljs.core/+, 所有参数必须是数字,在行1处获得 [clj-nil number]
WARNING: cljs.core/+, 所有参数必须是数字,在行1处获得 [clj-nil number]

object[cljs.spec.alpha.t_cljs$spec$alpha23729]

`

我还没有仔细想过这个问题,但这提出了一个很好的哲学问题:如果你有如下所示的代码,是否存在类型错误?

(if nil (+ nil 1) 0)

我的初步想法是,虽然这像是在森林里掉落的树,我们可能以某种方式处理它,也许我们应该纠正那个有问题的宏。无论如何,我还不想花太多时间去深思这个问题,只想至少和你分享一下。

0

评论者:mfikes

与这个工单无关,我们有一些先例:这在大版本1.10.520中引发了一个诊断。

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

                    ^

WARNING: cljs.core/+, 所有参数必须是数字,但在第1行收到了 [布尔 布尔] 替代品
nil
`

0

评论者:mfikes

我认为应该修复这个宏。上面的代码显示,即使你可以静态地证明某个代码路径不会被采取,分析警告也会触发那个路径上的代码。

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