Clojure 1.4似乎不支持没有类型提示的amap

时间:2012-09-14 17:14:04

标签: clojure

我正在通过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

我很难找到有关此问题的信息。什么时候引入了这个突破性的变化?或者我错误地理解了这一点?

1 个答案:

答案 0 :(得分:1)

突破性变化是RT/agetRT/aset的过于通用的重载已被删除。

当你想要原始速度时,

a[gs]et是有效的(否则你会seqvec数组)并且缺乏适当的提示会导致他们默默地采取一个慢速路径。