【问题标题】:access clojure via java classes通过 java 类访问 clojure
【发布时间】:2011-10-05 13:01:54
【问题描述】:

您好,我在 Java 类中有一个 main 方法,我想从我的 java 类中访问和运行我的 clojure 函数,可以吗?

请帮忙

【问题讨论】:

  • 我认为您拼错了“clojure”。不过不明白,我说“是”。
  • clojure 是一种 JVM 脚本语言(类似于 Lisp)。

标签: java functional-programming clojure


【解决方案1】:

如果您只想调用在 Clojure 脚本中定义的函数,以下代码可能会帮助您完成工作:

test.clj:

(ns test)
(defn hello [name]
  (println (str "Hi " name "!")))

TestRun.java:

import clojure.lang.RT;
public class TestRun {
    public static void main(String[] args) throws Exception {
        RT.loadResourceScript("test.clj");
        // var(namespace, function name).invoke(parameters..)
        RT.var("test", "hello").invoke("Daisy Duck");
    }
}

输出:

Hi Daisy Duck!

确保你的类路径中有 Clojure jar

【讨论】:

  • 在 2008 年 clojure 提前编译之前,这就是答案。今天实在是太低效了。正确的答案是用方法编译一个类,然后像其他任何方法一样从 java 调用它们。无需每次运行都编译
  • 是的,你当然是对的。我更喜欢在速度成为问题时进行优化;)
【解决方案2】:

您的 Clojure 代码是否已编译并打包在 jar 中?你的类路径中有jar吗?如果是这样,您应该可以像使用 Java 编写的一样使用 jar 中的类。

【讨论】:

    【解决方案3】:

    查看此问题的公认答案:Calling clojure from java

    简而言之,您可以添加要公开到命名空间的方法:

    (ns com.domain.tiny
      (:gen-class
        :name com.domain.tiny
        :methods [ [binomial [int int] double]]))
    

    然后编写函数。用 maven/leiningen 编译你的类文件

    然后从 java 中调用它们:

    System.out.println("(binomial 5 3): " + tiny.binomial(5, 3));
    

    这只是摘录。看看原始问题。

    【讨论】:

      【解决方案4】:

      检查 Java Scripting API 以调用脚本文件中的函数: http://download.oracle.com/javase/6/docs/technotes/guides/scripting/programmer_guide/index.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-27
        • 1970-01-01
        • 2013-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-14
        • 2021-09-26
        相关资源
        最近更新 更多