Как набрать подсказку - PullRequest
       1

Как набрать подсказку

7 голосов
/ 23 сентября 2010

Как мне напечатать подсказку, чтобы избавиться от оставшихся вызовов отражений?

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

Осталось два вызова рефлексии, но я не знаю, как от них избавиться.

Ответы [ 3 ]

3 голосов
/ 23 сентября 2010

Вы не показываете свой полный код или предупреждения об отражениях, но если они соответствуют моим ожиданиям, вам необходимо:

  1. подсказка A: (def ^"[[D" A ...) везде, где вы ее определяете
  2. приведите возвращаемое значение самого внутреннего выражения к двойному: (double (* 2 ...))

Процесс создания этих исправлений заключается в выполнении macroexpand для макроса, запуске этой версии, просмотре выражений, вызывающих предупреждения об отражениях, исправлении их и надежде на то, что вы сможете доукомплектовать подсказки в исходном макросе, этот случай возможен. Я все еще рекомендую более простое решение.

1 голос
/ 23 сентября 2010

ИМХО, это проще сделать без макроса 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 голосов
/ 29 сентября 2010

Эта страница (в конце) предоставляет полезную информацию о подсказках типа: http://clojure.org/java_interop. Рекомендуется использовать например (let [n (int)]) вместо ^ Integer и т. Д., Что также делает код намного более читабельным,Обратите внимание, что большая часть материала в Интернете, кажется, предназначена для более старых версий Clojure, и вам нужно меньше подсказок для типов в 1.2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...