什么是Clojure内在函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是Clojure内在函数相关的知识,希望对你有一定的参考价值。

浏览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) : doubler内在应用于乘法,同时确保返回类型为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内在函数的主要内容,如果未能解决你的问题,请参考以下文章

如何获取片段内在firebase中注册的用户数?

变压器与减速器的区别是什么? - Clojure

Clojure 类型提示,无法解析类名 clojure.core$double

Clojure学习笔记——介绍安装和语法

在这个简单的Clojure Ring应用程序中获取默认index.html文件以具有正确的Content-Type的正确方法是什么?

Clojure 中函数的类型提示