2012-09-14 31 views
3

我正在通过The Joy of Clojure(我的理解是为Clojure 1.2编写的)工作,并试图了解一些关于amap和相关函数的内容。Clojure 1.4似乎不支持没有类型提示的地图

下面的代码不会用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 

我很难在这个问题上找到信息。究竟是什么时候引入了这个突破性变革或者我错误地理解了这一点?

+2

数字处理在1.3中发生了很大的变化。信息在这里:http://dev.clojure.org/display/doc/Documentation+for+1.3+Numerics – Bill

+0

删除了我以前的评论。链接的文档没有具体说明在1.3(?) – noahlz

+0

中明显地(?)对'amap'做出的非向后兼容变化。对,我只是想指出你的总体方向。在我遇到的大多数情况下,Clojure代码的喜好保持得很好,但有一些已经过时了。 – Bill

回答

1

突破性变化是RT/agetRT/aset的过于泛化的过载被删除。

a[gs]et在那里当你想原始速度(否则你会seqvec阵列)和缺乏适当的提示的是使他们默默需要sloooow路径。