Como chamar o código Clojure de Java

Meu professor me permitiu praticar Clojure e Java! Eu definitivamente estou usando a oportunidade e quero que minha primeira atribuição Java chame algum código Clojure. Antes de ir para a atribuição real, quero criar um exemplo simples e funcional. Preciso da tua ajuda.

Eu li alguns links sobre interoperabilidade Java / Clojure. Isso e isso .

Usarei o primeiro link para demonstrar o que fiz até agora:

1) Eu criei um Projeto Clojure, despejei o arquivo .cli do site nele e usei a function de exportação no Eclipse para exportá-lo como .jar para uma pasta no meu diretório Documents.

2) Eu criei um segundo projeto Java, despejei o arquivo java nele e adicionei o clojure.jar como uma biblioteca referenciada.

Clojure ns:

(ns com.tiny (:gen-class :name com.tiny :methods [#^{:static true} [binomial [int int] double]])) 

Importação de Java:

 import com.tiny; 

O arquivo Java não reconhece com.tiny . Eu não sei porque. Os sites mencionaram algo sobre um caminho de class. Então eu encontrei o editor de caminho de class no eclipse e adicionei a pasta necessária com o .jar à lista de caminhos. Isso também não funcionou.

Eu não sei o que estou fazendo errado. Eu referenciei o jar, adicionei-o ao classpath e fiz um copy-paste completo do código no primeiro link (além do nome do pacote).

Código Java:

 import com.tiny; public class Main { public static void main(String[] args) { System.out.println("(binomial 5 3): " + tiny.binomial(5, 3)); System.out.println("(binomial 10042, 111): " + tiny.binomial(10042, 111)); } } 

Código Clojure:

 (ns com.tiny (:gen-class :name com.tiny :methods [#^{:static true} [binomial [int int] double]])) (defn binomial "Calculate the binomial coefficient." [nk] (let [a (inc n)] (loop [b 1 c 1] (if (> bk) c (recur (inc b) (* (/ (- ab) b) c)))))) (defn -binomial "A Java-callable wrapper around the 'binomial' function." [nk] (binomial nk)) (defn -main [] (println (str "(binomial 5 3): " (binomial 5 3))) (println (str "(binomial 10042 111): " (binomial 10042 111))) ) 

Para obter seu exemplo, executei o seguinte:

1) Criamos um projeto Clojure no Eclipse 2) Adicionamos o arquivo tiny.clj em src / com / tiny.clj 3) Exportamos esse projeto como um arquivo .jar (por exemplo: tiny.jar)

4) Criei o projeto Java como você descreve, com um arquivo Java – Main.java 5) Adicione clojure.jar e tiny.jar ao classpath do projeto Java. (Clique com o botão direito -> Configurar Caminho de Construção -> Guia Bibliotecas -> Adicionar JARs Externos)

Quando eu inicialmente tentei isso, eu não coloquei o arquivo tiny.clj no diretório com / (eu o tinha diretamente sob src /), e recebi um RuntimeException quando tentei executar a class Main que dizia que o arquivo era pequeno. clj e tiny__init.class não foram encontrados. Mover o arquivo tiny.clj para o subdiretório com / corrigiu o problema para mim e para a chuva principal com sucesso.

Um link extra que pode ser de ajuda sobre este assunto:

A biblioteca clojure-utils contém o código necessário para chamar o Clojure de Java de forma eficaz (sem a complexidade de usar a abordagem gen-class)

    Intereting Posts