什么是 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