Clojure's: класс gen и двойные массивы - PullRequest
3 голосов
/ 23 июля 2010

Я пытаюсь: gen-class a fn, который принимает двумерный массив Double в качестве входных данных.Я уже видел сообщение и решение здесь , относящиеся к аналогичной теме, но я все еще не могу создать рабочее решение.

(ns gui.heatmap
  (:gen-class
    :name gui.Heatmap
    :methods [[heat-map2 ["[[D"] org.jfree.chart.JFreeChart]]))

(defn foo [dbl-array]
  ...)

Я использую "[[D" на основе использования type на моем входе.Это прекрасно компилируется в файл .class.

Теперь, когда я перехожу к другому файлу .clj, у меня есть следующее.

(ns ...
  (import (gui.Heatmap)))

(defn bar [args]
  ...
  (.foo
    (into-array
      (vector
        (double-array <list of numbers>)
        (double-array <list of numbers>)
        (double-array <list of numbers>)))))

Когда я вызываю bar из ответа,Я получаю следующую ошибку:

java.lang.IllegalArgumentException: не найдено подходящего поля: heat_map2 для класса [[D

Есть мысли?

Ответы [ 2 ]

3 голосов
/ 23 июля 2010

Вам не хватает объекта.(.foo (into-array ...)) против (.foo (Heatmap.) (into-array...))

Обратите внимание, вам также следует require ваше gui.Heatmap пространство имен.В противном случае вы можете столкнуться с проблемами, если пространство имен ... скомпилировано до gui.Heatmap.Тогда импорт завершится неудачно, потому что класс еще не сгенерирован.Добавление require решит эту проблему.

Редактировать:

Чтобы прояснить ситуацию.

  • исправить отсутствующий объект
  • добавить требовать
  • исправить префикс (хороший улов от dbyrne!)
  • исправить: предложение импорта (также было неверно)
(ns gui.heatmap
  (:gen-class
    :name gui.Heatmap
    :methods [[heat-map2 ["[[D"] org.jfree.chart.JFreeChart]]))

(defn -foo [dbl-array]
  ...)

(ns ...
  (import gui.Heatmap))

(defn bar [args]
  ...
  (.foo
    (Heatmap.)
    (into-array
      (vector
        (double-array )
        (double-array )
        (double-array )))))
2 голосов
/ 23 июля 2010

Ответ Котарака хорош.Однако другая проблема заключается в том, что вам нужно назвать свою функцию -foo вместо foo.Либо так, либо измените :prefix внутри :gen-class.

...