我是学习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)
Run Code Online (Sandbox Code Playgroud)
这是非常简单的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))
Run Code Online (Sandbox Code Playgroud)
而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);
}
}
Run Code Online (Sandbox Code Playgroud)
我做错了什么?(再次注意:这是初始测试代码,只是为了进行第一次成功的函数调用)
谢谢你的帮助,我很无能为力.
rob*_*x44 11
Jeremy在评论中的链接显示了一种在clojure类中调用静态方法的方法.如果要在对象实例上调用clojure函数,则需要在包装器方法定义中添加一个参数:
(defn -myinc "comment" [this x] (myinc x))
Run Code Online (Sandbox Code Playgroud)
任何非静态包装函数都需要'this'参数.Clojure引发了一个异常,因为它只接收了一个仅用一个定义的函数的两个参数.注意,你不要改变你的:gen-class:methods部分或myinc函数定义本身.
文档有点稀疏,但可以在以下网址找到相关示例:http: //clojure.org/compilation(页面上的最后一个示例显示了实例方法).
| 归档时间: |
|
| 查看次数: |
936 次 |
| 最近记录: |