从Java调用Clojure:为什么;新";样式(clojure.java.api.clojure)比;旧的;一(发电机级)?

从Java调用Clojure:为什么;新";样式(clojure.java.api.clojure)比;旧的;一(发电机级)?,clojure,clojure-java-interop,Clojure,Clojure Java Interop,读了这本书后,我感到有些困惑: 有两种可能与Java开发人员共享我在Clojure中编写的函数 第一个是在JAR文件中提供它,这样他们就可以调用它,就像我用Java编写的一样。听起来很适合Clojure的宣传 第二种方法,据说是更好的方法,要求Java开发人员使用clojure.lang.IFn或clojure.lang.RT,并通过将函数名作为字符串(!)传递来调用函数,而不是仅仅调用它们 为什么第二种方法是“更好的方法”你在这里设置了一个错误的二分法。每种方法都涉及到创建一个jar文件:

读了这本书后,我感到有些困惑:

有两种可能与Java开发人员共享我在Clojure中编写的函数

  • 第一个是在JAR文件中提供它,这样他们就可以调用它,就像我用Java编写的一样。听起来很适合Clojure的宣传

  • 第二种方法,据说是更好的方法,要求Java开发人员使用
    clojure.lang.IFn
    clojure.lang.RT
    ,并通过将函数名作为字符串(!)传递来调用函数,而不是仅仅调用它们


为什么第二种方法是“更好的方法”

你在这里设置了一个错误的二分法。每种方法都涉及到创建一个jar文件:JVM程序就是这样分发的。但是Java代码调用jar中包含的Clojure代码有3种不同的方式:

  • 使用clojure.lang.RT中的方法初始化运行时,加载文件,然后查找变量。这是一种过时的方法
  • 使用clojure.java.api.clojure中的方法查找函数并调用它们。这是(1)的较新版本,隐藏了一些您可能意外出错的混乱内容
  • 使用Clojure库中的gen类为Clojure函数定义更为Java友好的接口
  • 你仍然可以做(3)——完全没有问题。但是gen类是一个相当笨重的工具,除了一些最简单的例子,比如公开一些静态方法,它并不是很有趣,而且使用Clojure提供一个“感觉”像Java API的API也不容易

    但是你知道在提供一个感觉像Java的API方面什么是好的吗?JAVA因此,如果您想使Clojure库在Java中易于使用,我建议您在Clojure库中包含一些Java代码。由您编写的Java代码填补了语言鸿沟。它通过上面的机制(2)访问Clojure代码,并提供了一个Java友好的外观,因此外部世界不必知道下面有Clojure


    是我多年前按照这种方法编写的库的一个示例。用纯Clojure编写这篇文章绝非易事,因为传统的Java习语对Clojure来说非常陌生,而且它并不完全支持它们。通过编写我自己的Java shim,Java客户机可以获得一个非常舒适的界面,我可以编写感觉像Clojure的Clojure,而不是一堆gen类的废话。

    您在这里设置了一个错误的二分法。每种方法都涉及到创建一个jar文件:JVM程序就是这样分发的。但是Java代码调用jar中包含的Clojure代码有3种不同的方式:

  • 使用clojure.lang.RT中的方法初始化运行时,加载文件,然后查找变量。这是一种过时的方法
  • 使用clojure.java.api.clojure中的方法查找函数并调用它们。这是(1)的较新版本,隐藏了一些您可能意外出错的混乱内容
  • 使用Clojure库中的gen类为Clojure函数定义更为Java友好的接口
  • 你仍然可以做(3)——完全没有问题。但是gen类是一个相当笨重的工具,除了一些最简单的例子,比如公开一些静态方法,它并不是很有趣,而且使用Clojure提供一个“感觉”像Java API的API也不容易

    但是你知道在提供一个感觉像Java的API方面什么是好的吗?JAVA因此,如果您想使Clojure库在Java中易于使用,我建议您在Clojure库中包含一些Java代码。由您编写的Java代码填补了语言鸿沟。它通过上面的机制(2)访问Clojure代码,并提供了一个Java友好的外观,因此外部世界不必知道下面有Clojure


    是我多年前按照这种方法编写的库的一个示例。用纯Clojure编写这篇文章绝非易事,因为传统的Java习语对Clojure来说非常陌生,而且它并不完全支持它们。通过编写我自己的Java shim,Java客户端可以获得一个非常舒适的界面,我可以编写感觉像Clojure的Clojure,而不是一堆gen类的废话。

    我认为你错了,请再次阅读这个答案。它被称为使用
    tiny。二项式(5,3)
    @m0skit0:调用
    tiny。二项式(5,3)
    是“旧方法”-这是我更喜欢的方法。“新方法”是@alex miller在下面进一步解释的方法,使用的表达式有
    IFn plus=Clojure.var(“Clojure.core”,“+”)
    如果你想从字符串中计算代码。你从哪里读到这种方法更好?@m0skit0:也许我必须重新回答我的问题。简而言之:如果我用Clojure编写函数,例如
    (defn foo…
    我希望我的Java朋友能够导入它并像用Java编写一样调用它;即
    x=foo()
    -我不想让他们做类似于
    RT.invoke(“foo”)
    的事情。我从哪里读到这种方法更好?请看Alex Miller(顶级Clojuter专家)的话:从Clojure 1.6.0开始,有一种新的首选方法来加载和调用Clojure函数。现在,这种方法比直接调用RT更好(并取代了这里的许多其他答案)。我认为你错了,请再次阅读该答案。它被称为使用
    tiny.二项式(5,3)
    @m0skit0:调用
    tiny.二项式(5,3)
    是“旧方法”——这是我更喜欢的方法。“新方法”“如果你想从字符串中计算代码,@alex miller在下面用
    IFn plus=Clojure.var(“Clojure.core”,“+”);
    等表达式进一步解释了这个问题。你从哪里读到这种方法更好?@m0skit0:也许我必须重新回答我的问题。简而言之:如果我用Clo编写函数