2010-09-23 13 views
7

Jak mogę wpisać podpowiedź, aby pozbyć się pozostałych wywołań odbicia?Jak wpisać podpowiedź

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

Zostały dwa odbicia, ale nie wiem, jak się ich pozbyć.

+0

Prawdopodobnie powinienem powiedzieć, co myślę, kod działa w przypadku, gdy go zepsułem. Próbuję tylko pomnożyć wszystkie elementy w tablicy 2d java przez 2 używając amap. – 2daaa

Odpowiedz

3

Nie pokazuj swój pełny kod lub ostrzeżenia odbicie, ale jeśli są, co myślę, że są, trzeba :

  1. wskazówkę A: (def ^"[[D" A ...) gdziekolwiek go zdefiniować
  2. rzutować wartości zwracanej najgłębszej wypowiedzi dwukrotnie: (double (* 2 ...))

Proces tworzenia tych poprawek polega na wykonaniu makrokopozycji w makrze, uruchomieniu tej wersji, sprawdzeniu, jakie wyrażenia powodują ostrzeżenia o odbiciach, naprawieniu ich i mam nadzieję, że możesz doposażyć wskazówki w oryginalne makro, które w ten przypadek jest możliwy. Wciąż zalecam bardziej proste rozwiązanie.

1

IMHO jest to łatwiejsze do zrobienia bez makra 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

Dzięki, mam już rozwiązanie zgodne z tymi zasadami. Właściwie to interesuję się porównaniem imperatywnego kodu, który napisałeś, do bardziej funkcjonalnego stylu za pomocą amapy. – 2daaa

+1

Należy zauważyć, że amap to makro, które rozwija się do czegoś bardzo podobnego do rozwiązania imperatywnego. –

0

Ta strona (na końcu) zawiera dobre informacje na temat podpowiedzi typu: http://clojure.org/java_interop. Zaleca użycie np. (niech [n (int)]) zamiast^Integer itd., co również sprawia, że ​​kod jest znacznie bardziej czytelny. Zauważ, że wiele materiałów w Internecie wydaje się być dla starszych wersji Clojure i potrzebujesz mniej wskazówek w 1.2.