你对Clojure有什么看法?

dee*_*lue 51 lisp clojure

你们对Clojure有什么看法?我正在考虑接下来学习它,目前正在使用Erlang并且除了记录惨败之外总体上对它很满意...... Clojure和LISP一样强大吗?

Mar*_*rko 134

考虑学习它.如果没有其他原因,那么因为你可以在一个真实的项目中实际使用它.

You : Can I use this small Java library called Clojure?
Boss: Why do you need it?
You : For some concurrency improvements.
Boss: Ok.
Run Code Online (Sandbox Code Playgroud)

  • 在Java One之后,我在酒吧问了一下这个帖子,并且我解释了他的回答"肯定会以任何方式偷偷用Clojure!" (24认同)

Mar*_*bst 27

你在Lisp-1和Lisp-2中引用的是函数和变量是否共享同一名称空间的问题.在Lisp-1 Lisps中,就像Scheme和Clojure一样.在Lisp-2 Lisps中,就像Common Lisp一样,它们没有.这主要是品味和/或方便的问题 - 它不会影响编程语言的力量.

举个例子,在Clojure中你可以这样做:

(defn my-apply [func arg1 arg2]
  (func arg1 arg2))
Run Code Online (Sandbox Code Playgroud)

这是一个函数,它接受一个函数和两个值,并将函数应用于值.例如:

user=> (my-apply + 1 2)
3
Run Code Online (Sandbox Code Playgroud)

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

(defun my-apply (func arg1 arg2)
  (funcall func arg1 arg2))
Run Code Online (Sandbox Code Playgroud)

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

=> (my-apply #'+ 1 2)
3
Run Code Online (Sandbox Code Playgroud)

这里的问题是相反的:"+"是一个函数,但你想把它作为变量传递,所以你必须"转换"它."#'+"是"(function +)"的简称,顺便说一下.

  • 当然.但话说回来,Clojure使地图和矢量可以调用.我并不是说它非常有用,只是可能有一些意义. (5认同)
  • 有趣的结果是:在Common Lisp作为Lisp-2,你知道在(foo 2)FOO将是一个函数.例如,没有办法在函数空间中输入数字.这意味着,您不必在运行时检查此项,而不是在FUNCALL中. (3认同)

kon*_*onr 22

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

  • 它与Java很好地通信,所以我可以外包我的编码
  • 它可以访问各种各样的java库,包括Swing和Weka
  • 由于它在JVM上运行,因此您可以更安全地假设您的问题无处不在
  • 如果您可以使用更少的代码显示相同的库,则可以将Java程序员转换为lambda方式
  • 而且,最重要的是,我没有与Emacs联系在一起

:WQ

  • +1"你可以安全地假设你的**问题**将在任何地方工作"部分.不确定这是一个错字或故意,但它让我笑. (6认同)
  • 你有没有尝试过Armed Bear Common Lisp,JVM上完整的CL实现.它的发展似乎非常活跃. (4认同)

All*_*nde 17

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

除了我们现在为JVM提供一个好的LISP工具之外没有其他原因我喜欢这种语言.

  • @Rayne:那是因为它是用英语实现的. (7认同)
  • 并非所有Lisp方言都同样强大.除非A至少和B一样强大,否则你的意思是B可以在A中实现.在这种情况下,所有图灵完整的编程语言同样强大,问题变得荒谬. (3认同)
  • 老训练有素的鸽群争吵. (3认同)

Ber*_*own 15

"Clojure有可能为面向并发的编程做十九年前Java为面向对象编程所做的事情:使用一种语言(或者,在Clojure的情况下,一种"语言环境")使用它可以更简单程序员已经习惯了什么." - Bill Clementson

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


小智 14

我觉得这个名字很聪明.


Art*_*ldt 5

我使用Erlang进行协调的网络负载测试,并且它非常适合,因为问题完全在Erlang的"正确执行分布式通信软件"的"甜蜜点"内.我发现Clojure对于需要在具有多个线程的单个框上执行复杂操作的代码更好(这是更常见的情况).

你已经领先于曲线了,因为你知道Erlang,这将帮助你发现它真正闪耀的问题.Clojures真正的"甜蜜点"是什么?


art*_*non 5

Clojure是一个Lisp-1,是的.可以把它想象成一个没有历史包袱的更好的Common Lisp.它还有几个现代并发功能,如STM和Agents(他们决定不实现Erlang的Actors模型).在JVM上运行的优点很简单 - 已经为它编写了许多库(主要是Java).

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