什么是 Clojure 内在函数
What are Clojure Intrinsics
浏览 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)
乘法没有。
通过确保 return 类型也为 double
,您可以获得 clojure.lang.Numbers.multiply(double, double) : double
内在函数以应用于 r
的乘法运算。
例如这个:
(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 源代码时,我发现了一个 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)
乘法没有。
通过确保 return 类型也为 double
,您可以获得 clojure.lang.Numbers.multiply(double, double) : double
内在函数以应用于 r
的乘法运算。
例如这个:
(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