2011-01-24 26 views
9

Tôi rất mới trong việc học Clojure. Đây là Clojure đầu tiên và rất đơn giản của tôi, trong đó tôi gọi một phương thức Clojure đơn giản từ bên trong mã java. Thật không may nó không hoạt động. Compilation là thành công và từ Clojure REPL chức năng bằng văn bản thực hiện vì nó được lệnh, nhưng khi gọi từ Java nó nói như sau:Gọi hàm clojure rất đơn giản từ Java không hoạt động

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) 

Đây là mã Clojure rất đơn giản:

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

Và phần 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); 
} 
} 

Tôi đã làm gì sai? (Lưu ý một lần nữa: Đây là mã kiểm tra primitve chỉ để thực hiện cuộc gọi hàm thành công đầu tiên)

Cảm ơn sự giúp đỡ, tôi không biết gì.

+0

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

Trả lời

11

Liên kết Jeremy trong các nhận xét cho bạn thấy một cách để gọi một phương thức tĩnh trong lớp clojure. Nếu bạn muốn gọi một hàm clojure trên một thể hiện đối tượng, bạn cần phải thêm một tham số để xác định phương pháp wrapper của bạn:

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

Tham số 'này' là cần thiết cho bất kỳ chức năng wrapper không tĩnh. Clojure đã ném một ngoại lệ vì nó nhận được hai tham số cho một hàm chỉ được định nghĩa với một hàm. Lưu ý, bạn không thay đổi bất kỳ điều gì trong phần: gen-class: methods hoặc định nghĩa hàm myinc của chính nó.

Tài liệu hơi thưa thớt, nhưng các ví dụ về điều này có thể được tìm thấy tại: http://clojure.org/compilation (ví dụ cuối cùng trên trang hiển thị các phương pháp mẫu).

+0

Cảm ơn câu trả lời nhanh. Nó hoạt động tốt. :) – Ujvari

Các vấn đề liên quan