Clojure内置函数是什么?

3
浏览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

内置函数究竟是如何使用的?谢谢。


这可能是一个更适合在Clojure电子邮件列表中发问的问题:https://groups.google.com/forum/#!forum/clojure - Alan Thompson
1个回答

2
目前,内置函数仅在编译的表达式需要保持非装箱状态时才使用。因此,在您的示例中,乘法(* r 2.0)接受了内置处理(导致示例中invokeStatic中的一个dmul),但乘法(* #<result of (* r 2.0)> 3.141592)则没有。
您也可以通过确保返回类型为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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接