在哪些情况下使用Clojure更好?

时间:2009-11-26 00:22:16

标签: lisp clojure scheme

我在Lisp和Scheme中开发,但我正在阅读Clojure,然后我想知道,在哪种情况下使用它比使用Lisp或Scheme更好?感谢

12 个答案:

答案 0 :(得分:56)

这个问题无法回答。你应该使用Clojure几乎100%的时间而不是CL和Scheme,这就是我要说的。但这并不意味着你应该听我说。其他人可以提出一个好的论据,反之亦然。

对我来说,Clojure中的语法和函数名称在美学上令人愉悦。某些Java库对于我为数据调整和Web编程以及GUI工作所做的工作非常宝贵。功能编程具有挑战性和愉悦性。 Clojure的缺陷并不重要,它在我眼中的好处超过了它。其他Lisps中的某些无法容忍的缺陷在Clojure中被“修复”,因为它是新的,它可以忽略向后兼容性。它有一种新颖且可论证的强大的并发方法。 Clojure社区充满活力,热情而且令人敬畏。所有这些都说明了我和我对Clojure或其他Lisps的看法。

在Clojure或Java中不存在CL和Scheme的库。有些人不喜欢Clojure如何使用过多的语法,如[]{},并希望在任何地方使用parens。如果你想要CLOS风格的OOP或许多可变数据结构,另一个Lisp可以说更好。对于某些人来说,JVM是重量级的,可能是太重量级和太多的行李。很多Java泄漏到Clojure(按设计),这冒犯了一些人的敏感性。 STM和不可变数据结构具有使某些事物(例如数字运算)更慢或更不优雅的开销。 Clojure是新的,在某些领域仍然很粗糙,在其他领域仍在快速变化和发展。 Clojure还没有通过时间的考验,而其他Lisps已经有了。 Clojure不是一个“标准”,有些人发现实现定义的语言没有吸引力。等等。这些事对我来说都不重要,但它们可能对你而言。

这几乎完全是主观的。您应该使用哪种语言取决于您已经知道的内容,您愿意学习的内容,您想要使用的库,您喜欢的编辑器和工具,您愿意接受的语言缺陷和解决方法。您无法容忍的缺陷,以及什么可以帮助您更快,更便宜,更愉快地完成工作,或实现您的目标。

基本上,无论是什么让你感到温暖和模糊。了解所有这些,然后根据自己的口味做出明智的选择,并使用您最喜欢的一个。他们都很好。

答案 1 :(得分:22)

“Clojure在JVM上运行”意味着您可以获得整个Java库的丰富多彩。您可以在Swing中创建漂亮的GUI,使用Apache的Web客户端或服务器代码,连接现成的Sudoku解算器......无论您喜欢什么。

Clojure的另一大优点是它非常优秀的并发支持,大约有3种不同的口味。如果您有一个计算密集型,可并行化的任务,Clojure可以让它变得简单。好吧,更容易。

更新:另一个论点。 Clojure功能非常强大,所以如果你想强迫自己在功能上思考和写作,这是一个加分。

答案 2 :(得分:9)

当?越多越好。 为什么?不可变数据结构 - 它们确实非常好。还有很多other reasons

答案 3 :(得分:8)

应该使用Clojure

  • 您需要使用现有的Java代码。
  • 你和那些对lisp过敏的人一起工作(“老板,我想使用一个名为clojue的java并发库,而我想在方案中重写这个”[1]
  • 您将为多处理器系统编程。

在以下情况下方案会更好:

  • 您需要证明您的代码是正确的。 Clojures(调用java)会阻碍但不会阻止这种情况。
  • 您正在与对java过敏的人一起工作。
  • 您正在为没有(足够新的)JVM
  • 的平台开发

[1]是的,这是一个坏坏的坏理由。这就是我们生活的世界......

答案 4 :(得分:8)

ABCL(Armed Bear Common Lisp)和一些Scheme实现(KAWA,SISC,...)也在JVM上运行。

一般来说Common Lisp有不同的'风味' - ABCL就是其中之一。其他编译为C,本机代码,具有广泛的开发环境或逻辑语言或数据库等专用扩展。

Clojure OTOH是一种新的Lisp方言,强调懒惰的函数式编程和并发编程。它的作者(Rich Hickey)是一位非常有经验的软件开发人员(他还为Common Lisp编写了Java和.net接口)并且在Clojure方面表现出色。虽然围绕这种语言有一些炒作,但值得一试 - 它绝对是近年来开发的更好的Lisp方言之一(与Newlisp或Arc相比)。

答案 5 :(得分:8)

有很多原因,有些是上面提到的。我的看法是:

  1. 预先存在的库。这是这样的一个好处。我只是不能赞美这个功能。
  2. 语言更适应 硬件目前可用 (多核)和发展 今天使用的范例。推理并发性要容易得多。功能方面也更好。显然,你可以在Lisp中进行函数式编程,但很容易在不知不觉中,无意中和无意中打破范式。
  3. 跨平台。我跑得一样 Linux,Windows和Windows上的程序 苹果电脑。有许多本地Lisps 跨平台运行但是 支持所有功能 平台有点参差不齐 经常要警惕 对于一个缺少的东西 平台或其他。同样, 你需要的图书馆并非总是如此 始终如一地支持 平台。 ABCL和一些 JVM Scheme实现有这个 一贯的支持,但我 仍然喜欢Clojure因为 第2点。
  4. 语言的本质 社区。让我们面对现实,很多 Common Lisp社区的时间 只是讨厌处理。那是 根本不是Clojure的情况。 没有它很容易获得有用的帮助 那种屈尊和卑鄙 通常会附带答案 Common Lisp社区。就像我一样 多次为自己学习, 毫无疑问这么愚蠢 你不会得到礼貌和乐于助人 来自Clojure社区的回复。
  5. 如果我必须找到一件可以抱怨的事情,那就是IDE支持。也许这是一个学习新习惯的问题,但是我比Clojure更容易处理Java开发的机制。我尝试过,使用Clojure Box,在NetBeas上使用Enclojure,在Intellij IDEA上使用La Clojure,在Eclipse上使用Counterclockwise。如果您主要使用REPL,它们都可以正常工作,但是对于类文件的编译和执行,它们仍然感觉有点笨拙。

答案 6 :(得分:7)

Clojure的一个子集也可以编译为 javascript

答案 7 :(得分:3)

Clojure在JVM(和CLR)上运行,所以就是这样。

答案 8 :(得分:3)

Clojure的设计涉及安全地适应多种类型的并发编程,故意难以在其他语言中错误地编写危险,摇摇晃晃且经常损坏的并发容错代码。如果您的问题域涉及并发编程,Clojure用于管理并发的集成工具数组可能比其他Lisp和Scheme中可用的特定于实现或最低公分母的库更适合。

答案 9 :(得分:3)

Clojure最大的优点之一就是可以使用它的大量库。你拥有Java的强大功能和Lisp的表现力,这是一个坏蛋组合。 Clojure更适合现实世界的发展,因为它是为现实世界的发展而制作的。使用Clojure,您可以拥有令人敬畏的图书馆,令人敬畏的现代功能,以及一个由志趣相投的人组成的迷人社区。

我不得不说Clojure是一种更好的语言,一直到处都是。这是一个非常有争议的陈述,所以我在这里指出这只是我的诚实意见。

Clojure rock。

答案 10 :(得分:2)

我一直在努力学习新语言,所以我对学习Clojure很感兴趣。但是,不是SBCL和其他一些Common Lisp实现,比Clojure快得多吗?难道你不需要超过4个处理器(以及一个可合理并行化的任务)来弥补Clojure应用程序与同一个应用程序的单线程SBCL版本之间的性能差异吗?

答案 11 :(得分:2)

作为一般的经验法则,在其中任何一种符合要求的情况下,我倾向于支持Clojure而不是其他语言: (1)。域模型往往看起来非常递归和/或图形。 (2)。有机会利用多核JVM环境(例如,Elastic Beanstalk) (3)。数据和代码之间存在模糊障碍(想想RPN计算器,其中节点可以是运算符或数字)

这听起来可能有点人为,但我的很多工作涉及处理图形和信息树,无论是查看社交网络,某种基于约束的优化还是语义关系构建。我发现,与Clojure相比,我最喜欢的另一种语言Ruby不能给我带来表现力和原始计算能力的混合,特别是在定量,递归,并发型问题解决方面。