【发布时间】:2012-09-14 17:14:03
【问题描述】:
我正在研究 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.3 中发生了相当大的变化。信息在这里:dev.clojure.org/display/doc/Documentation+for+1.3+Numerics
-
删除了我之前的评论。链接的文档没有明确解决在 1.3(?)中对
amap所做的非向后兼容更改(?) -
对,我只是想为您指明大方向。在我遇到的大多数情况下,Clojure 代码的乐趣都很好,但有一些已经过时了。
标签: clojure