2010-09-23 8 views
7

¿Cómo teclear sugerencia para eliminar las llamadas de reflexión restantes?Cómo escribir la sugerencia

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

Quedan dos llamadas de reflexión, pero no sé cómo deshacerme de ellas.

+0

Probablemente debería decir lo que creo que está haciendo el código en caso de que lo estropee. Solo estoy tratando de multiplicar por 2 todos los elementos en una matriz java 2d usando amap. – 2daaa

Respuesta

3

Usted no muestra su código completo o las advertencias de reflexión, pero si son lo que yo creo que son, usted necesitará :

  1. pista a: (def ^"[[D" A ...) donde quiera que se defina
  2. convertir el valor devuelto de la expresión más íntima a doble: (double (* 2 ...))

El proceso para llegar a estas correcciones es realizar macroexpand en la macro, ejecutar esa versión, ver qué expresiones están causando las advertencias de reflexión, corregirlas y esperar que pueda actualizar las sugerencias en la macro original, que en este caso es posible Todavía recomiendo la solución más directa.

1

mi humilde opinión, esto es más fácil de hacer sin la macro 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))) 
+0

Gracias, ya tengo una solución en ese sentido. De hecho, estoy interesado en comparar el código de estilo imperativo que escribió con el estilo más funcional utilizando amap. – 2daaa

+1

Tenga en cuenta que amap es una macro que se expande a algo muy parecido a la solución imperativa. –

0

Esta página (al final) proporciona buena información sobre el tipo de alusión: http://clojure.org/java_interop. Se recomienda usar, p. (let [n (int)]) en lugar de^Integer, etc., que también hace que el código sea mucho más legible. Tenga en cuenta que gran parte del material en Internet parece ser para versiones anteriores de Clojure y necesita menos sugerencias de tipo en 1.2.

Cuestiones relacionadas