如何输入提示

时间:2010-09-23 15:21:20

标签: clojure

我如何输入提示来摆脱剩余的反射调用?

(def B 
     (amap ^"[[D" A i ^"[[D" B 
          (amap ^doubles (aget A (int i)) j ^doubles row 
             (* 2 (aget row (int j))))))

还剩下两个反射调用,但我不知道如何摆脱它们。

3 个答案:

答案 0 :(得分:3)

您没有显示完整的代码或反射警告,但如果它们是我认为的那样,您将需要:

  1. 提示A:(def ^"[[D" A ...)无论您在何处定义
  2. 将最内层表达式的返回值强制转换为double:(double (* 2 ...))
  3. 提出这些修补程序的过程是在宏上执行宏扩展,运行该版本,查看导致反射警告的表达式,修复它们,并希望您可以将提示改装为原始宏,其中包含这种情况是可能的。我仍然建议更直接的解决方案。

答案 1 :(得分:1)

恕我直言,没有amap宏,这更容易做到:

(set! *warn-on-reflection* true)
(def ^"[[D" A (into-array [(double-array [0 1 2]) (double-array [2 3 4])]))

(def ^"[[D" B (into-array (map aclone A))) ; aclone is shallow
(dotimes [i (alength B)]
  (let [^doubles row (aget B i)]
    (dotimes [j (alength row)]
      (aset row j (double (* 2 (aget row j)))))))

(doseq [row B]
  (prn (vec row)))

答案 2 :(得分:0)

此页面(最后)提供了有关类型提示的详细信息:http://clojure.org/java_interop。它建议使用例如(让[n(int)])代替^ Integer等,这也使代码更具可读性。请注意,互联网上的很多材料似乎是旧版本的Clojure,你需要更少的类型提示1.2。