什么是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) : 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 类型提示,无法解析类名 clojure.core$double
在这个简单的Clojure Ring应用程序中获取默认index.html文件以具有正确的Content-Type的正确方法是什么?