java - 如何从 Java 调用 Clojure 代码

标签 java interop clojure

我的教授允许我同时练习 Clojure 和 Java!我肯定会利用这个机会,并希望我的第一个 Java 作业调用一些 Clojure 代码。在开始实际作业之前,我想创建一个简单的工作示例。我需要你的帮助。

我已经阅读了一些关于 Java/Clojure 互操作性的链接。 This , 和 This .

我将使用第一个链接来演示我到目前为止所做的事情:

1) 我创建了一个 Clojure 项目,将站点中的 .cli 文件转储到其中,并使用 Eclipse 中的导出功能将其作为 .jar 文件导出到我的文档目录中的文件夹中。

2) 我创建了第二个 Java 项目,将 java 文件转储到其中并将 clojure.jar 添加为引用库。

Clojure ns:

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

Java 导入:

import com.tiny;

Java 文件无法识别 com.tiny。我不知道为什么。这些站点提到了一些关于类路径的内容。所以我在 eclipse 中找到了类路径编辑器,并将带有 .jar 的所需文件夹添加到路径列表中。这也没有用。

我不知道我做错了什么。我已经引用了 jar,将它添加到类路径中,并在第一个链接中(除了包名称之外)对代码进行了完整的复制粘贴。

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));
    }
}

Clojure 代码:

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

(defn binomial
  "Calculate the binomial coefficient."
  [n k]
  (let [a (inc n)]
    (loop [b 1
           c 1]
      (if (> b k)
        c
        (recur (inc b) (* (/ (- a b) b) c))))))

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

(defn -main []
  (println (str "(binomial 5 3): " (binomial 5 3)))
  (println (str "(binomial 10042 111): " (binomial 10042 111)))
)

最佳答案

为了成功运行您的示例,我执行了以下操作:

1) 在 Eclipse 中创建一个 Clojure 项目 2) 在 src/com/tiny.clj 中添加文件 tiny.clj 3) 将该项目导出为 .jar 文件(例如:tiny.jar)

4) 按照您的描述创建了 Java 项目,其中包含一个 Java 文件 - Main.java 5) 将clojure.jar 和tiny.jar 添加到Java 项目的类路径中。 (右键单击 -> 配置构建路径 -> 库选项卡 -> 添加外部 JAR)

当我最初尝试这个时,我没有将 tiny.clj 文件放在 com/目录中(我直接把它放在 src/下),当我尝试运行 Main 类时我得到了一个 RuntimeException 说找不到文件 tiny.clj 和 tiny__init.class。将 tiny.clj 文件移动到 com/子目录为我和 Main rain 成功解决了这个问题。

关于java - 如何从 Java 调用 Clojure 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5452665/

相关文章:

c# - Outlook Interop C# 排序项目不起作用

clojure - 如何在Clojure中解释 map 键?

java - Android BroadcastReceiver 不会注册

java - 在 verticle vert.x 中实例化类的危险

java - Android Studio,关闭应用程序时会记住输入

c# - 无法将类型 'object' 隐式转换为 'Microsoft.Office.Interop.Excel.Worksheet' 。存在显式转换(您是否缺少转换?)

c# - 如何知道从 C++ dll 传递到 C# 的数组的大小

clojure - 使用 lein 将依赖项添加到 clojure 项目

clojure - Lisp (Clojure) 和 Tcl 在抽象和元编程能力方面如何比较?

java - 如何解决 'cannot find symbol'错误?