簡體   English   中英

從Java調用一個非常簡單的clojure函數是行不通的

[英]Calling a very simple clojure function from Java does not work

我是學習Clojure的新手。 這是我第一次也是非常簡單的Clojure嘗試,我在java代碼中調用了一個簡單的Clojure方法。 不幸的是它不起作用。 編譯是成功的,並且從Clojure REPL開始,編寫的函數按照它的順序執行,但是當從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);
 }
}

我做錯了什么? (再次注意:這是初始測試代碼,只是為了進行第一次成功的函數調用)

謝謝你的幫助,我很無能為力。

Jeremy在評論中的鏈接顯示了一種在clojure類中調用靜態方法的方法。 如果要在對象實例上調用clojure函數,則需要在包裝器方法定義中添加一個參數:

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

任何非靜態包裝函數都需要'this'參數。 Clojure引發了一個異常,因為它只接收了一個僅用一個定義的函數的兩個參數。 注意,你不要改變你的:gen-class:methods部分或myinc函數定義本身。

文檔有點稀疏,但可以在以下網址找到相關示例: http//clojure.org/compilation (頁面上的最后一個示例顯示了實例方法)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM