2010-09-23 13 views
7

Come digitare un suggerimento per eliminare le chiamate di riflessione rimanenti?Come digitare il suggerimento

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

Ci sono due chiamate di riflessione a sinistra, ma non so come sbarazzarsi di loro.

+0

Probabilmente dovrei dire cosa penso che il codice stia facendo nel caso in cui l'ho incasinato. Sto solo cercando di moltiplicare tutti gli elementi in un array java 2d per 2 usando amap. – 2daaa

risposta

3

Non mostrare il proprio codice completo o gli avvertimenti di riflessione, ma se sono quello che penso che sono, avrete bisogno di :

  1. suggerimento a: (def ^"[[D" A ...) ovunque si definisce
  2. cast del valore restituito dell'espressione più interno a doppio: (double (* 2 ...))

Il processo per elaborare queste correzioni è eseguire macroexpand sulla macro, eseguire quella versione, vedere quali espressioni causano gli avvertimenti di riflessione, correggerli e sperare che sia possibile riadattare i suggerimenti nella macro originale, che in questo caso è possibile. Raccomando ancora la soluzione più semplice.

1

IMHO questo è più facile da fare senza 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

Grazie, ho già una soluzione su queste linee. In realtà sono interessato a confrontare il codice di stile imperativo che hai scritto con lo stile più funzionale usando amap. – 2daaa

+1

Si noti che amap è una macro che si espande in qualcosa di molto simile alla soluzione imperativa. –

0

Questa pagina (alla fine) fornisce buone informazioni sul tipo di suggerimento: http://clojure.org/java_interop. Si consiglia di utilizzare per es. (Sia [n (int)]) anziché^Intero ecc., che rende anche il codice molto più leggibile. Nota che molto del materiale su internet sembra essere per le versioni precedenti di Clojure e hai bisogno di meno suggerimenti di tipo in 1.2.

Problemi correlati