3

我正在研究 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

我很难找到有关此问题的信息。究竟是什么时候引入了这一重大变化?还是我理解错了?

4

1 回答 1

1

突破性的变化是两者的通用重载都RT/agetRT/aset删除了。

a[gs]et当你想要原始速度(否则你会seqvec数组)并且缺乏适当的提示导致他们默默地采取缓慢的路径时,是否存在。

于 2013-02-14T09:46:39.357 回答