2011-01-24 2 views
9

Я очень новичок в изучении Clojure. Это предназначалось для моих первых и очень простых попыток Clojure, в которых я называю простой метод Clojure из внутреннего кода Java. К сожалению, это не сработает. Компиляция прошла успешно и с Clojure REPL письменной функция делает так, как было приказано, но при вызове из Java он говорит следующее:Вызов очень простой функции clojure из Java не работает

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) 

Вот очень простой 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)) 

И 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); 
} 
} 

Что я сделал не так? (Примечание снова: это код проверки primitve, чтобы сделать первый успешный вызов функции)

Спасибо за помощь, я не знаю.

+0

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

ответ

11

Ссылка Джереми в комментариях показывает вам один способ вызова статического метода в классе clojure. Если вы хотите, чтобы вызвать функцию Clojure на экземпляре объекта, необходимо добавить параметр к вашей обертке определению метода:

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

«этот» параметр необходим для любой не-статической функции-оболочки. Clojure выбрасывал исключение, потому что он получил два параметра для функции, определенной только с помощью одного. Обратите внимание: вы ничего не меняете в своем разделе: gen-class: methods или самом определении функции myinc.

Документация немного редка, но примеры этого можно найти по адресу: http://clojure.org/compilation (в последнем примере на странице показаны методы экземпляра).

+0

Спасибо за быстрый ответ. Сейчас это прекрасно. :) – Ujvari

Смежные вопросы