2010-07-23 7 views
3

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

(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

Любые мысли ?

ответ

3

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

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

Edit:

Чтобы прояснить вещи.

  • исправление отсутствует объект
  • добавить требуют
  • починки префикс
  • FIX (хороший улов по 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))))) 
+0

Если я создал 'foo' static (so' (defn^{: static true} -foo ...) '), я бы тогда позвонил' foo' by '(Heatmap/-foo (in-array .. .)) '? –

+0

Ну, даже если это не статично, мне говорят, что я не могу разрешить имя класса Heatmap, несмотря на то, что вижу, что он был сгенерирован. –

+0

Я обновил пример. Возникла еще одна проблема с предложением импорта. Я также добавил исправление dbyrne для префикса функции. – kotarak

2

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