2024 年 Clojure 状况调查 中分享您的想法!

欢迎!请查看 关于 页面,了解有关此内容的更多信息。

0
编译器

嗨,

我注意到以下情况

user> (-> '(some-> 1 inc) clojure.walk/macroexpand-all (clojure.pprint/pprint ))
(let*
 [G__427566 1]
 (if (clojure.core/nil? G__427566) nil (inc G__427566)))

例如,编译时已知的值(如标量)完全没有必要在运行时进行空检查。

更实际的用例可以在这里找到: https://github.com/clojure-emacs/refactor-nrepl/blob/cb939222d45bc20926202868922bd3e457d59b8f/src/refactor_nrepl/ns/tracker.clj#L33-L35

修复此问题将提高性能,并且还可以让像 Eastwood 这样的代码检查器更加开心(我现在正在调整代码,以同时忽略此错误)

1 个回答

+1

选中
 
最佳答案

检查“运行时已知的值”是一个不简单的操作,这种模式有一个简单的解决方案(并且由于 JIT 而可能在大多数情况下略有性能提升)。因此,我不认为这样做有意义。

此外,你提到的实际使用情况实际上不是一个运行时常量,而是一个必须评估的表达式,因此不是一个示例。
谢谢,看起来很合理。我们可以观察到`clojure.core/symbol`永远不会返回nil,并且相应地`some->`宏展开有一些冗余。但是,没有类型系统或类似clojure.spec注解的静态分析,很难自动化这一点。这两个现在都不是‘东西’。
...