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的linters更加愉快(我在此期间正在调整它以省略此错误)

1 答案

+1

选择
 
最佳答案

检查“运行时已知的值”是一个复杂的操作,这个模式有一个简单的解决方案(并且由于即时编译(jit),在大多数情况下可能会在性能上略有改进)。因此,我不认为这样做是有意义的。

此外,你提到的实际应用场景实际上不是一个运行时常量,而是一个必须评估的表达式,因此不是一个例子。
谢谢,听起来相当合理。可以观察到 `clojure.core/symbol` 从不返回 nil,相应地,`some->` 宏扩展有一些冗余。但是,没有类型系统,或者类似于 clojure.spec 注释支持的静态分析,很难自动化。这两者现在都不是一种“事物”。
...