我正在处理 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)))))
回复:
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)))))
回复:
user=> (asum-sq (float-array [1 2 3 4]))
30.0
我很难找到有关此问题的信息。这个突破性的变化到底是什么时候引入的?还是我理解有误?
最佳答案
突破性的变化是 RT/aget
和 RT/aset
的过于通用的重载被删除了。
a[gs]et
用于当您需要原始速度(否则您将 seq
或 vec
数组)并且缺少适当的暗示使他们默默地选择了一条缓慢的道路。
关于Clojure 1.4 似乎不支持没有类型提示的 amap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12429109/