2017-05-24 6 views
2

Ceci est mon monen/fichier junk.cljClojure: gen-classe ne fonctionne pas dans Java app

(ns myns.junk 
    (:gen-class 
    :name booklist.util 
    :methods [[sq [int] int]])) 

(defn sq [x] (* x x)) 

Je suis en cours d'exécution lein ubserjar sans problème. J'ai importé le pot généré dans mon application java, puis couru cette

package javaapplication1; 

import booklist.util; 

public class JavaApplication1 { 
    public static void main(String[] args) { 
     util u = new util(); 
     System.out.println(u.sq(45)); 
    } 
} 

qui produit une erreur

Exception dans le thread "principal" java.lang.UnsupportedOperationException: carrés (myns.junk/-sq non défini?) at booklist.util.sq (source inconnue) at javaapplication1.JavaApplication1.main (JavaApplication1.java:14) C: \ Utilisateurs \ X750JA \ AppData \ Local \ NetBeans \ Cache \ 8.2 \ exécuteur -snippets \ run.xml: 53: Java renvoyé: 1 BUILD FAILED (temps total: 0 seconde)

Qu'est-ce qui me manque, et idéalement, y a-t-il des documents disponibles qui expliquent ces choses en détail?


Modifier, par la réponse de Alejandro, j'ai essayé ce

(ns myns.junk 
    (:gen-class 
    :name booklist.util 
    :methods [[sq [int] int]])) 

(defn sq [x] (* x x)) 

(defn -sq 
    "A Java-callable wrapper around the 'sq' function." 
    [n] 
    (sq n)) 

qui produit maintenant erreur

Exception dans le thread "principal" clojure.lang.ArityException: Mauvais nombre args (2) passé à: junk/-sq à clojure.lang.AFn.throwArity (AFn.java:429) à clojure.lang.AFn.invoke (AFn.java:36) à booklist.util.sq (Inconnu Source) at javaapplication1.JavaApplication1.main (JavaApplication1.java:14) C: \ Utilisateurs \ X750JA \ AppData \ Local \ NetBeans \ Cache \ 8.2 \ executor-snippets \ run.xml: 53: Java renvoyé: 1 BUILD FAILED (temps total: 0 secondes)


ce que je blesse avec était ce

(ns myns.junk 
    (:gen-class 
    :name booklist.util 
    :methods [#^{:static true} [sq [int] int]])) 

(defn -sq [x] (* x x)) 

(-sq 7) ; works - 49 

il semble donc que je dois déclarer la méthode statique, et définir la méthode réelle d'avoir un chef de file dash dans le nom.

Répondre

2

vous manque quelque chose comme ça dans votre fichier clojure

(defn -sq 
    "A Java-callable wrapper around the 'sq' function." 
    [n] 
    (sq n)) 

En outre, vous devrez définir la méthode statique.

Je pense que la documentation canonique est ici: https://clojure.org/reference/compilation

+0

Merci pour la réponse - je mis à jour ma question avec cette tentative - il semble Java ne fonctionne toujours pas comme il :( –

+0

@AdamRackis Je pense qu'il devrait en fait être un méthode statique –