Clojure:gen-class在Java app

时间:2017-05-24 16:01:05

标签: java clojure leiningen clojure-java-interop

这是我的myns / junk.clj文件

(ns myns.junk
  (:gen-class
    :name booklist.util
    :methods [[sq [int] int]]))

(defn sq [x] (* x x))

我正在运行lein ubserjar而没有问题。我已经在我的java应用程序中导入了生成的jar,然后运行了这个

package javaapplication1;

import booklist.util;

public class JavaApplication1 {
    public static void main(String[] args) {
        util u = new util();
        System.out.println(u.sq(45));   
    }
}

产生错误

  

线程“main”中的异常java.lang.UnsupportedOperationException:sq(myns.junk / -sq未定义?)       at booklist.util.sq(Unknown Source)       在javaapplication1.JavaApplication1.main(JavaApplication1.java:14)   C:\ Users \ X750JA \ AppData \ Local \ NetBeans \ Cache \ 8.2 \ executor-snippets \ run.xml:53:Java返回:1   BUILD FAILED(总时间:0秒)

我缺少什么,理想情况下,是否有任何类型的文档可以详细解释这些内容?

根据亚历杭德罗的回答编辑,我试过这个

(ns myns.junk
  (:gen-class
    :name booklist.util
    :methods [[sq [int] int]]))

(defn sq [x] (* x x))

(defn -sq
  "A Java-callable wrapper around the 'sq' function."
  [n]
  (sq n))

现在产生错误

  

线程“main”中的异常clojure.lang.ArityException:错误的args(2)传递给:junk / -sq       在clojure.lang.AFn.throwArity(AFn.java:429)       在clojure.lang.AFn.invoke(AFn.java:36)       at booklist.util.sq(Unknown Source)       在javaapplication1.JavaApplication1.main(JavaApplication1.java:14)   C:\ Users \ X750JA \ AppData \ Local \ NetBeans \ Cache \ 8.2 \ executor-snippets \ run.xml:53:Java返回:1   BUILD FAILED(总时间:0秒)

我最终得到的是这个

(ns myns.junk
  (:gen-class
    :name booklist.util
    :methods [#^{:static true} [sq [int] int]]))

(defn -sq [x] (* x x))

(-sq 7) ; works - 49

所以我似乎需要将方法声明为static,并定义实际方法以在名称中包含前导短划线。

1 个答案:

答案 0 :(得分:2)

你的clojure文件中缺少这样的东西

(defn -sq
  "A Java-callable wrapper around the 'sq' function."
  [n]
  (sq n))

此外,您需要将方法定义为静态。

我认为规范性文档在这里:https://clojure.org/reference/compilation