我有時會編寫java方法,特別是對於基本類型/數組操作,我一直在關於如何在Clojure 1.8下使用類型提示。我看到一些線索,但他們(或許?)過時了,因爲他們已經在2年多前發佈了。Clojure:類型提示塔
我會給出一個基本的例子來說明我的觀點(我知道這個例子有點無意義)。在這裏,我想總結兩個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 +總是更快
* *警告反射*標誌將有助於這種探索。只要將其設置爲true,編譯器就會發出信號,指出它無法選擇所需的方法過載並需要提示。 – leetwinski
謝謝我已經測試過,最後還是不需要提示。你知道爲什麼這個函數比較慢,因爲它只適用於double?我的直覺是互操作隱含了一些隱藏的操作/成本,因此Java互操作只有在函數成本高昂(如大算法)或函數不存在於Clojure中時才值得。 –
@leetwinski原始類型提示與反射警告無關,這些提示是針對對象的。原始提示是爲了避免拳擊的表現。更好的辦法是在clojure文件的乞討中啓用''(set!* unchecked-math *:warn-on-boxed)''。 – ClojureMostly