Clojure:类型提示塔

时间:2017-03-07 12:35:36

标签: clojure type-hinting

我有时会编写java方法,特别是对于原语/数组操作,我总是不知道如何在Clojure 1.8下使用类型提示。我看到了一些线索,但考虑到它们已经在两年多前发布,它们(可能?)过时了。

我将给出一个基本的例子来说明我的观点(我知道这个例子有点无意义)。在这里,我想总结两个double并返回double

这是一个Java方法:

public static double add (double a, double b) {

    return a + b;
}

然后我想要一个Clojure包装器:

版本1

(defn d+ ^double 
  [^double a ^double b]
  (Doubles/add a b))

第2版

(defn d+ ^double 
  [^double a ^double b]
  (Doubles/add ^double a ^double b))

第3版

(defn d+ ^double 
  [^double a ^double b]
  (Doubles/add (double a) (double b)))

我不知道在何处放置类型提示以及如何放置它们。我的印象是(double x)效率较低,因为它是一个函数(也许我错了?)。 那么在身体功能或外部提供提示之间有什么区别?

或者这些提示可能没有必要,因为Java类中只有一个方法? 我没有看到逻辑,所以一般我使用版本1或3(更多更好?)。

请注意,对于此示例,Clojure +总是更快

1 个答案:

答案 0 :(得分:3)

版本1是正确的。它将发出以下字节代码:

public final class compile_inspect$d_PLUS_ extends AFunction implements DDD {
    public compile_inspect$d_PLUS_() {
    }

    public static double invokeStatic(double a, double var2) {
        return Primitives.add(a, var2);
    }

    public Object invoke(Object var1, Object var2) {
        return new Double(invokeStatic(RT.uncheckedDoubleCast((Number)var1), RT.uncheckedDoubleCast((Number)var2)));
    }

    public final double invokePrim(double var1, double var3) {
        return invokeStatic(var1, var3);
    }
}

Primitives.add就像您的Doubles/add函数一样。

如果你想要表演并避免拳击,你应该设置:

(set! *unchecked-math* :warn-on-boxed)

同时浏览Java interop reference(CTRL + F"原语")也会有所帮助。