2011-01-24 7 views
9

Sono molto nuovo nell'apprendimento di Clojure. Questo voleva essere il mio primo e molto semplice tentativo di Clojure in cui chiamo un semplice metodo Clojure dall'interno del codice java. Sfortunatamente non funziona. La compilazione è successo e dalla Clojure REPL la funzione scritta fa come è stato ordinato, ma quando si chiama Java si dice il seguente:Chiamare una funzione clojure molto semplice da Java non funziona

Exception in thread "main" java.lang.IllegalArgumentException: Wrong number of args (2) passed to: ClojNum$-myinc 
at clojure.lang.AFn.throwArity(AFn.java:439) 
at clojure.lang.AFn.invoke(AFn.java:43) 
at com.experimental.clojure.test.ClojNum.myinc(Unknown Source) 
at com.experimental.clojure.java.JavaCaller.main(JavaCaller.java:14) 

Ecco il molto semplice codice Clojure:

(ns com.experimental.clojure.test.ClojNum 
    (:gen-class 
    :init init 
    :name com.experimental.clojure.test.ClojNum 
    :methods [ 
      [myinc [int] int] 
    ])) 

(defn -init [] [[] (atom [])])  
(defn myinc "comment" [x] (+ x 1))  
(defn -myinc "comment" [x] (myinc x)) 

E la parte java:

package com.experimental.clojure.java; 

import com.experimental.clojure.test.ClojNum; 

public class JavaCaller { 
/** 
    * @param args 
    */ 
public static void main(String[] args) { 
    int i = 0; 
    System.out.println(i); 
    ClojNum c = new ClojNum(); 
    i = c.myinc(0); 
    System.out.println(i); 
} 
} 

Cosa ho sbagliato? (Nota ancora: questo è il codice di prova di primitve solo per effettuare una prima chiamata di funzione riuscita)

Grazie per l'aiuto, sono all'oscuro.

+0

http://stackoverflow.com/questions/2181774/calling-clojure-from-java – Jeremy

risposta

11

Il collegamento di Jeremy nei commenti mostra un modo per chiamare un metodo statico in una classe clojure. Se si desidera chiamare una funzione clojure in un'istanza di oggetto, è necessario aggiungere un parametro al tuo involucro definizione di metodo: è richiesto

(defn -myinc "comment" [this x] (myinc x)) 

Il 'questo' dei parametri per una funzione wrapper non statici. Clojure ha lanciato un'eccezione perché ha ricevuto due parametri per una funzione definita solo con uno. Nota, non cambi nulla nella tua sezione: gen-class: methods o la stessa definizione della funzione myinc.

La documentazione è un po 'scarsa, ma alcuni esempi sono disponibili al seguente indirizzo: http://clojure.org/compilation (l'ultimo esempio nella pagina mostra i metodi di istanza).

+0

Grazie per la risposta rapida. Funziona ora bene. :) – Ujvari

Problemi correlati