Clojure 如何键入提示

Clojure 如何键入提示,clojure,Clojure,我该如何键入提示以摆脱剩余的反射调用 (def B (amap ^"[[D" A i ^"[[D" B (amap ^doubles (aget A (int i)) j ^doubles row (* 2 (aget row (int j)))))) 还剩两个反射调用,但我不知道如何摆脱它们。没有amap宏,这更容易做到: (set! *warn-on-reflection* true) (def ^"[[D" A (into-a

我该如何键入提示以摆脱剩余的反射调用

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

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

没有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)))

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

  • 提示A:
    (def^“[[D”A…
    无论您在何处定义它
  • 将最里面表达式的返回值强制转换为double:
    (double(*2…)

  • 提出这些修复的过程是对宏执行宏扩展,运行该版本,查看导致反射警告的表达式,修复它们,并希望您可以将提示改装到原始宏中,在这种情况下这是可能的。我仍然推荐更简单的解决方案。

    此页(最后)提供有关类型提示的良好信息:。建议使用例如。(let[n(int)])而不是“^Integer”等,这也使代码更具可读性。请注意,互联网上的许多资料似乎是针对较旧版本的Clojure的,您在1.2中需要更少的类型提示。

    我可能应该说我认为代码在做什么,以防我弄糟。我只是尝试将2d java数组中的所有元素乘以2使用amap。谢谢,我已经有了一个解决方案。实际上,我对比较您编写的命令式代码和使用amap的更具功能性的代码很感兴趣。请注意,amap是一个宏,它可以扩展到与命令式解决方案非常类似的内容。