Вызов очень простой функции clojure из Java не работает - PullRequest
9 голосов
/ 24 января 2011

Я очень новичок в изучении Clojure.Это была моя первая и очень простая попытка Clojure, в которой я вызываю простой метод Clojure из кода Java.К сожалению, это не работает.Компиляция прошла успешно, и из REPL 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);
 }
}

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

Спасибо за помощь, я не в курсе.

1 Ответ

11 голосов
/ 24 января 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...