2024 年 Clojure 调查问卷! 中分享您的想法。

欢迎!请访问关于 页面了解更多本站的工作方式。

0
Clojure

关于 clojure.core/not= 的文档字符串表示 "等价于 (not (= obj1 obj2))"。但由于 clojure.core/= 拥有内联算子,生成的代码可能不同。

`
user=> (defn v1 [] (not= (bit-and 0 0) 0))

'user/v1

user=> (println (disassemble v1))
...
public static java.lang.Object invokeStatic();

 0  getstatic indy_type_hint.core$v1.const__0 : clojure.lang.Var [15]
 3  invokevirtual clojure.lang.Var.getRawRoot() : java.lang.Object [20]
 6  checkcast clojure.lang.IFn [22]
 9  lconst_0
10  lconst_0
11  invokestatic clojure.lang.Numbers.and(long, long) : long [28]       <<<<<<< doesn't use land intrinsic
14  invokestatic clojure.lang.Numbers.num(long) : java.lang.Number [32]
17  getstatic indy_type_hint.core$v1.const__2 : java.lang.Object [36]
20  invokeinterface clojure.lang.IFn.invoke(java.lang.Object, java.lang.Object) : java.lang.Object [40] [nargs: 3]
25  areturn

...

user=> (defn v2 [] (not (= (bit-and 0 0) 0)))

'user/v1

user=> (println (disassemble v2))
...
public static java.lang.Object invokeStatic();

 0  getstatic indy_type_hint.core$v2.const__0 : clojure.lang.Var [15]
 3  invokevirtual clojure.lang.Var.getRawRoot() : java.lang.Object [20]
 6  checkcast clojure.lang.IFn [22]
 9  lconst_0
10  lconst_0
11  land               <<<<<<< uses land intrinsic
12  lconst_0
13  invokestatic clojure.lang.Util.equiv(long, long) : boolean [28]
16  ifeq 25
19  getstatic java.lang.Boolean.TRUE : java.lang.Boolean [34]
22  goto 28
25  getstatic java.lang.Boolean.FALSE : java.lang.Boolean [37]
28  invokeinterface clojure.lang.IFn.invoke(java.lang.Object) : java.lang.Object [41] [nargs: 2]
33  areturn

...
`

该补丁将为 clojure.core/not= 添加与 clojure.core/= 相同的内联算子。应用补丁后,编译器将为 v1 和 v2 都生成 v2 的字节码。

2 个答案

0

评论由:schmee 提出

这是我第一次提交补丁,如果有什么地方做错了,请告诉我们。另外,我还没有签署 CLA,但是我将在接下来的几周内这样做。

0
参考:[https://clojure.atlassian.net/browse/CLJ-2340](https://clojure.atlassian.net/browse/CLJ-2340)(由 schmee 报告)
...