Clojure库缺乏(所以使用Java)......?

时间:2011-06-30 10:16:04

标签: java clojure

从Clojure开始,使用Java库很容易......但Clojure没有哪些库最好用Java完成?

6 个答案:

答案 0 :(得分:1)

对这个答案提出一个简单的问题并不容易,因为首先需要定义 Clojure库 Java库之间的区别。 (更重要的是,因为Clojure是一个Java库:))

好的,让我们从一个前提开始,即Clojure库是用Clojure编写的任何库,只是忽略Clojure实现本身的Java代码。但是,如果给定库使用一些Java依赖,比如说一个Apache Commons库会怎样?它仍然可以作为Clojure而不是Java库吗?

我自己的标准(我也猜测你的标准)因为两者之间的区别在于库是否公开了一个带有名称空间,函数,序列的Clojure风格的接口,或者是带有类,方法和类的Java风格的接口。集合。

在这些Java库中编写Clojure包装器几乎是微不足道的。根据我的经验,如果您希望在应用程序的整体功能设计中适应库的功能,那么这非常有用。一个简单的例子是,如果你想对序列进行map Java方法。您可以使用ad-hoc定义的匿名函数来包装方法调用,也可以使用包装器层中的命名函数。如果你经常这样做,第二种方法可能更适合,至少对于最常用的方法。

所以,我的结论是任何Java库都应该很容易转换到Clojure库。所需要的就是为它编写一个包装器。

另一个结论是可能根本不需要它。如果你想要的只是调用方法,你可能仍然只是调用方法并避免所有的架构航天。 :)

答案 1 :(得分:1)

一个可能的答案可能是字节码库,如ASM http://asm.ow2.org/

但老实说,随着时间的推移,Java中的任何库都可以用clojure编写。如果clojure使用下面的ASM,则可以复制编译为不同字节码的一些Java代码。

答案 2 :(得分:1)

我非常喜欢Clojure作为开发语言,但我发现使用Java库或编写Java代码而不是Clojure有几个很好的理由:

  • 利用成熟的Java库 - 一些Java库非常优秀且非常成熟。从实用的角度来看,你最好直接使用像Netty,Swing或Joda Time这样的Java库,而不是试图利用或发明一些Clojure替代品。有时这些库有Clojure包装器,但这些库大多仍处于实验/未成熟状态。
  • 高性能代码 - 我做了大量的数据和图像处理,其中最重要的是性能。这几乎排除了增加开销的任何方法(例如延迟序列,临时对象创建),因此惯用的Clojure将无法满足要求。你可以用非常单一的Clojure(例如许多紧凑的命令循环和原始数组操作......)到达那里但是如果你要编写这种代码,它通常在Java中实际上更简单和更清洁
  • 具有可变语义的API - 如果您依赖的API依赖于可变对象,那么与这些API交互的Clojure代码可能会变得有点丑陋和单一。有时在这些情况下编写Java更简单。

好消息是因为Clojure和Java之间的互操作性非常好,所以在项目中混合使用Clojure和Java代码并没有任何问题。因此,我的大部分项目都是Clojure和Java代码的混合 - 我使用最适合手头任务的项目。

答案 3 :(得分:0)

想到用于构建GUI的库。

答案 4 :(得分:0)

很多API。事实上,Clojure本身是建立在许多坚固的Java API之上的,比如java.util.Collection API。众所周知的像Incanter这样的Clojure API建立在Parallel Colt和JFreeChart等库之上。

答案 5 :(得分:0)

目前我找不到报价;但Rich表示“clojure应该尽可能使用java”的效果,而不是不必要地包装java。主要是拥抱java平台而不是对抗它。所以一般建议成为:

如果存在一个好的java库,请使用它,如果不是在clojure中写一个。