clojure - 什么是 Clojure 内在函数

标签 clojure compiler-construction clojure-java-interop

浏览 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)乘法则不然。

您可以获得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

关于clojure - 什么是 Clojure 内在函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52100795/

相关文章:

Clojure 使用重载方法具体化 Java 接口(interface)

xml - 为什么 clojure.data.xml 在解析 RDF 文件时不返回 xml 命名空间?

java - 当我将 maven java 编译器插件从 1.5 更改为 1.6 时,为什么我会得到一个不可映射的字符来编码 UTF-8?

clojure - Timbre(Clojure),需要一分钟完成

vb.net - 为什么在 VB.NET 中传递 "Me"ByRef 是合法的?

java - 编译器 asm 字节码表达式

clojure - 我可以在 Clojure 中对 Java 方法调用进行部分处理吗?

multithreading - 与 Clojure 的线程同步

emacs - 有没有一种快速的方法来连接 clojure swank 和 slime 以便在 emacs 中快速复制?

clojure - 如何在 Clojure 中编写/执行类型操作?