代码之家  ›  专栏  ›  技术社区  ›  erdos

什么是Clojure内在论

  •  3
  • erdos  · 技术社区  · 7 年前

    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 .

    本质究竟是如何使用的?非常感谢。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Michał Marczyk    6 年前

    目前,只有在编译的表达式要保持未装箱的情况下才使用内部函数。因此 (* 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