2010-07-23 9 views
3

J'essaye de: gen-class a fn qui prend un tableau 2D de doubles en entrée. J'ai déjà vu le poste et la solution here concernant un sujet similaire, mais je suis toujours incapable de produire une solution de travail.Clojure's: gen-class et double array

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

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

J'utilise le "[[D" basé sur l'utilisation type sur mon entrée. Cela compile bien dans un fichier .class.

Maintenant, quand je passe à un autre fichier .clj, j'ai ce qui suit.

(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>))))) 

Quand j'appelle bar de la rempl, je reçois l'erreur suivante:

java.lang.IllegalArgumentException: Aucun champ correspondant trouvé: heat_map2 pour la classe [[D

Toutes les pensées ?

Répondre

3

L'objet vous manque. (.foo (into-array ...)) vs (.foo (Heatmap.) (into-array...))

Notez, vous devez également require votre espace de noms gui.Heatmap. Sinon, vous pouvez avoir des problèmes si l'espace de noms ... est compilé avant gui.Heatmap. Ensuite, l'importation échoue, car la classe n'est pas encore générée. L'ajout du require résoudra ce problème.

Edit:

Pour clarifier les choses.

  • fix objet manquant
  • add nécessitent
  • préfixe fix
  • fix (bonne prise par dbyrne!): Clause d'importation (a aussi eu tort)
(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

Si je rendais 'foo' static (donc' (defn^{: static true} -foo ...) '), devrais-je appeler' foo' par '(Heatmap/-foo (into-array) .))? –

+0

Eh bien, même sans être statique, on me dit que je suis incapable de résoudre le nom de classe Heatmap, en dépit du fait de pouvoir voir qu'il a été généré. –

+0

J'ai mis à jour l'exemple. Il y avait un autre problème avec la clause d'importation. J'ai aussi ajouté le correctif de dbyrne pour le préfixe de la fonction. – kotarak

2

La réponse de Kotarak est bien. Cependant, un autre problème est que vous devez nommer votre fonction -foo au lieu de foo. Soit cela ou changer le :prefix à l'intérieur :gen-class.