【问题标题】:Clojure 1.4 seems to not support amap without type hintsClojure 1.4 似乎不支持没有类型提示的 amap
【发布时间】: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


【解决方案1】:

重大变化是 RT/agetRT/aset 的过于通用的重载被删除了。

a[gs]et 用于当您想要原始速度时(否则您将使用 seqvec 数组)并且缺乏适当的提示导致他们默默地走一条慢路。

【讨论】:

    猜你喜欢
    • 2020-07-17
    • 1970-01-01
    • 2019-09-11
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    • 2018-09-18
    • 2018-03-10
    • 2012-06-02
    相关资源
    最近更新 更多