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

修复这个问题将提高性能,并且另外也会使类似的lint工具,如Eastwood,更为满意(我现在正在调整它以忽略这个错误)

1 个答案

+1

已被选中
 
最佳答案

检查“运行时已知的值”是一个非平凡的实现操作,且此模式有简单的解决方案(而且由于jit,在大多数情况下可能对性能的改进是微小的)。因此,我不确定这样做是否合理。

此外,您提到的实际使用情况实际上不是一个运行时常量,而是一个必须被评估的表达式,因此它不是一个例子。
谢谢,听起来很公平。您可能会注意到`clojure.core/symbol`永远不返回nil,因此`some->`宏展开有一些冗余。然而,如果没有类型系统或像clojure.spec注解那样的静态分析,很难自动化这一点。这两种方法在当今都不是“事物”。
...