【问题标题】:What are Clojure Intrinsics什么是 Clojure 内在函数
【发布时间】:2018-08-30 15:37:16
【问题描述】:

浏览 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 compiler-construction clojure-java-interop


【解决方案1】:

目前,内在函数仅用于正在编译的表达式旨在保持未装箱的情况。因此,您的示例中的 (* r 2.0) 乘法确实接受了内在处理(导致您的示例 dmul 中的一个 invokeStatic),但 (* #&lt;result of (* r 2.0)&gt; 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    相关资源
    最近更新 更多