51

你们觉得 Clojure 怎么样?我正在考虑下一步学习它,目前正在使用 Erlang,除了记录惨败之外,总体上对它很满意...... Clojure 和 LISP 一样强大吗?

4

10 回答 10

133

考虑学习它。如果没有其他原因,那么因为您可以在实际项目中实际使用它。

You : Can I use this small Java library called Clojure?
Boss: Why do you need it?
You : For some concurrency improvements.
Boss: Ok.
于 2009-02-18T11:24:00.380 回答
26

Lisp-1 vs Lisp-2 所指的是函数和变量是否共享相同名称空间的问题。在 Lisp-1 Lisp 中,就像 Scheme 和 Clojure 一样,它们确实如此。在 Lisp-2 Lisp 中,就像 Common Lisp 一样,它们没有。这主要是一个品味和/或方便的问题——它不会影响编程语言的功能。

例如,在 Clojure 中,您可以这样做:

(defn my-apply [func arg1 arg2]
  (func arg1 arg2))

这是一个接受一个函数和两个值并将函数应用于值的函数。例如:

user=> (my-apply + 1 2)
3

在 Common Lisp 中,你必须把它写成

(defun my-apply (func arg1 arg2)
  (funcall func arg1 arg2))

您需要“funcall”的原因是,由于“func”在变量的名称空间中,因此您不能像在 Clojure 中那样直接将其用作函数,而 Clojure 没有这种区别。所以你必须告诉 Common Lisp“请将此变量解释为一个函数并使用这些参数调用它”。这样做的另一个后果是,要获得相同的结果,您必须像这样调用“my-apply”:

=> (my-apply #'+ 1 2)
3

这里的问题反过来了:“+”是一个函数,但是你想把它作为一个变量传递,所以你必须“转换”它。"#'+" 是 "(function +)" 的缩写,顺便说一句。

于 2009-03-20T10:54:01.247 回答
22

我使用 Clojure 而不是 CL,因为:

  • 它与 Java 沟通良好,所以我可以外包我的编码
  • 它可以访问数以万计的 java 库,这些库可以做各种各样的事情,包括 Swing 和 Weka
  • 由于它在 JVM 上运行,因此您可以更安全地假设您的问题在任何地方都有效
  • 如果你可以用更少的代码展示相同的库,你可以将 Java 程序员转换为 lambda 方式
  • 而且,最重要的是,我不依赖 Emacs

:wq

于 2009-10-07T09:20:50.047 回答
16

Clojure 是 LISP 的一种方言,所以,是的,它和 LISP 一样强大。

没有别的原因,我们现在有一个很好的 JVM 的 LISP 工具,我喜欢这种语言。

于 2009-01-16T19:32:38.887 回答
14

我觉得这个名字很聪明。

于 2009-01-16T19:30:35.473 回答
14

“Clojure 有潜力在面向并发编程方面做 Java 十年前在面向对象编程方面所做的事情:使正确使用类似于程序员已经习惯了。”——比尔·克莱门森

和人一样,LISP 由一系列编程语言组成。有像 Common Lisp 和 Clojure 这样的 Lisp 方言。最重要的是,Common Lisp 或 Scheme 有很多实现。

于 2009-01-16T19:49:57.307 回答
5

I used Erlang at work for coordinated network load testing and it was perfect for that because the problem was well within Erlang's "sweet spot" of "doing distributed communication oriented software correctly". I find Clojure MUCH better for code that needs to do something complex on a single box with several threads (this is a more common scenario).

You are ahead of the curve because you know Erlang and this will help you spot the problems in which it really shines. What do you thing Clojures real "sweet spot" is?

于 2009-06-12T18:15:03.707 回答
5

Clojure 是一个 Lisp-1,是的。将其视为没有所有历史包袱的更好的 Common Lisp。它还具有几个现代并发功能,例如 STM 和 Agents(他们决定不实现 Erlang 的 Actors 模型)。在 JVM 上运行的优势很简单——已经有很多库为它编写(主要是在 Java 中)。

Clojure 中的 Clojure是在 Clojure 中重写 Clojure 编译器的持续努力,以使其更具可移植性和可维护性。除了 core.clj,目前大部分 Clojure 都是用 Java 编写的。此举之后,可以将其移植到很多虚拟机上,包括 Parrot。

于 2009-10-14T14:22:55.893 回答
3

与 Clojure 相比,我更喜欢 Common Lisp,因为它的语法更规则,而且它与可怕的(恕我直言)Java API 无关。

对于 Common Lisp,我还可以在几个优秀且经过良好测试的实现和一个可以依赖的成熟标准之间进行选择。

但如果我必须使用 Java 完成工作,那么我肯定会考虑使用 Clojure。:)

于 2009-02-19T10:45:52.210 回答
3

我所说的“Clojure 和 LISP 一样强大”的意思是我在 stackoverflow 上的某个地方读到 Common Lisp 是 lisp-2 而 Clojure 是 lisp-1?(我很容易在这里闲逛)......

就并发性而言,我真的很喜欢 Erlang 的故事,因为通过在 Actor 模型中编写应用程序来分发应用程序非常容易

来自 Clojure 的创建者,网址为http://groups.google.com/group/clojure/browse_thread/thread/2a2b24ffef5d1631?pli=1

“即使有演员,Clojure 也不会有分布式并发的故事,但我正在考虑只是采用 Erlang 的批发,将 Jinterface 用于 Clojure<->Clojure 甚至 Clojure<->Erlang 分布式进程。也许这看起来像 Termite完成了。敬请期待。”

于 2009-01-16T20:17:42.803 回答