我正在通过The Joy of Clojure(我理解为Clojure 1.2编写),我正在尝试理解amap
及相关函数。
以下代码在没有类型提示的Clojure 1.4中不起作用:
(defn asum-sq [xs]
(let [dbl (amap xs i ret
(* (aget xs i)
(aget xs i)))]
(areduce dbl i ret 0.0
(+ ret (aget dbl i)))))
REPL:
user=> (asum-sq (float-array [1 2 3 4]))
IllegalArgumentException No matching method found: aset clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:80)
添加了类型提示的版本:
(defn ^Double asum-sq [^floats xs]
(let [^floats dbl (amap xs i ret
(* (aget xs i)
(aget xs i)))]
(areduce dbl i ret 0.0
(+ ret (aget dbl i)))))
REPL:
user=> (asum-sq (float-array [1 2 3 4]))
30.0
我很难找到有关此问题的信息。什么时候引入了这个突破性的变化?或者我错误地理解了这一点?
答案 0 :(得分:1)
突破性变化是RT/aget
和RT/aset
的过于通用的重载已被删除。
a[gs]et
是有效的(否则你会seq
或vec
数组)并且缺乏适当的提示会导致他们默默地采取一个慢速路径。