Clojure: gen-class не работает в приложении Java

Это мой файл myns/junk.clj

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

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

Я запускаю lein ubserjar без проблем. Я импортировал сгенерированную банку в свое Java-приложение, а затем запустил это

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 не определено?) в booklist.util.sq(неизвестный источник) в 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))

который теперь выдает ошибку

Исключение в потоке «основной» clojure.lang.ArityException: неправильное количество аргументов (2) передано: junk/-sq в clojure.lang.AFn.throwArity(AFn.java:429) в clojure.lang.AFn.invoke( AFn.java:36) в booklist.util.sq(неизвестный источник) в 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

Итак, кажется, мне нужно объявить метод статическим и определить фактический метод, чтобы в имени был начальный тире.


person Adam Rackis    schedule 24.05.2017    source источник


Ответы (1)


Вам не хватает чего-то подобного в вашем файле clojure

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

Кроме того, вам нужно определить метод как статический.

Я думаю, что каноническая документация находится здесь: https://clojure.org/reference/compilation

person Alejandro C.    schedule 24.05.2017
comment
Спасибо за ответ - я обновил свой вопрос этой попыткой - кажется, Java все еще не нравится :( - person Adam Rackis; 24.05.2017
comment
@AdamRackis Я думаю, что это должен быть статический метод - person Alejandro C.; 24.05.2017