繁体   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