浏览 Clojure 源代码时我发现了 Intrinsics.java
文件。它看起来像是一些 clojure 运行时函数到 JVM 操作码的映射。
但是,我不确定它们应用在哪里。代码如下
(def ^:const pi 3.141592)
(defn circumference [^double r] (* r 2.0 pi))
编译为
public static java.lang.Object invokeStatic(double r);
0 dload_0 [r]
1 ldc2_w <Double 2.0> [14]
4 dmul
5 ldc2_w <Double 3.141592> [16]
8 invokestatic clojure.lang.Numbers.multiply(double, double) : double [23]
11 invokestatic java.lang.Double.valueOf(double) : java.lang.Double [29]
14 areturn
我看到 clojure.lang.Numbers.multiply(double, double) : double
没有被替换为 DMUL
。
到底如何使用内在函数?谢谢。
最佳答案
目前,内部函数仅用于正在编译的表达式应保持未装箱状态的情况。因此(* r 2.0)
您的示例中的乘法确实接受了内在处理(导致您的示例中的 dmul
invokeStatic
),但是 (* #<result of (* r 2.0)> 3.141592)
乘法则不然。
您可以获得clojure.lang.Numbers.multiply(double, double) : double
应用于乘法 r
的内在函数并确保返回类型为 double
也是如此。
例如:
(def ^:const pi 3.141592)
(defn circumference ^double [^double r] (* r 2.0 pi))
编译为以下内容:
public static double invokeStatic(double r);
0 dload_0 [r]
1 ldc2_w <Double 2.0> [14]
4 dmul
5 ldc2_w <Double 3.141592> [16]
8 dmul
9 dreturn
关于clojure - 什么是 Clojure 内在函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52100795/