{{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/=}} 相同的内联函数类型添加到 {{clojure.core/not=}}。应用此补丁后,编译器为 {{v1}} 和 {{v2}} 都发出了 {{v2}} 字节码。