什么类型的问题是Clojure在解决Scala方面的好/坏?

del*_*ber 25 scala clojure

这两种语言都是基于JVM的,对功能编程有很强的支持.我知道会出现一大类问题,两种语言都能提供出色的解决方案.我想知道的是,如果有任何特殊类型的问题,Clojure的功能会给它一个显着的优势来反对Scala和反之亦然.目前我们在Scala中做了很多工作,但我想留意Clojure可能提供更好解决方案的特定问题空间.

mik*_*era 38

这两种语言都非常强大,适用于几乎所有领域.你不能用这两种语言特别出错 - 我甚至可以说它们可能是目前最有前途的两种语言.

我仍然认为有几个领域他们各自都有独特的优势:

Clojure相对于Scala的特殊优势:

  • 并发性 - Clojure在语言中内置了独特且非常强大的并发支持,基于一种新的思考对象身份和可变状态的方式.这在其他地方已得到很好的解释,所以我不会在这里详细介绍,但Rich Hickey的这段视频是获得一些见解的好地方.
  • 元编程 - Clojure是一种同源语言,使其特别适用于基于宏的元编程,DSL创建和代码生成.它遵循Lisp"代码是数据"这一方面的理念.
  • 动态类型 - Clojure是一种动态语言,具有通常与动态语言相关的所有优点(较少的样板,快速原型设计,非常简洁的代码等)
  • 函数式编程 - 虽然你可以在Scala中做FP,但是Clojure肯定感觉更像是一个功能性语言(而Scala可能最好被描述为多范式).Clojure中的这种功能强调以几种方式表现出来,例如内置于所有核心库的惰性评估支持,所有数据结构都是不可变的,惯用的Clojure"编码风格"是功能性而非命令性/ OOP.

Scala相对于Clojure的特殊优势:

  • 面向对象 - Scala在概念上更接近Java,并且更好地支持Java风格的OOP方法.虽然你可以在Clojure中做OOP,但它并不适合.
  • 语法熟悉 - 对于来自其他非Lisp语言的人来说,Scala语法可能会更加舒适
  • 静态类型 - Scala有一个非常复杂的静态类型系统.在静态类型是优势的情况下,Scala将具有明显的优势.静态类型的通常优点适用 - 编译器可以捕获更多潜在的"类型"错误,编译器有更多机会进行性能优化等.
  • 更成熟 - Scala比Clojure(2003年和2007年)的时间要长一些,因此您可以从更成熟的语言中获得一些好处(更好的工具支持,更大的社区)

为了完整起见,两种语言都有一些独特的优势:

  • 积极和创新的社区 - 两种语言都建立了一个活跃的社区,各种各样的贡献者
  • 与Java的出色互操作性 - 两种语言都可以轻松利用Java生态系统中的大量库和工具
  • JVM的优势 - 两种语言都受益于JVM中的所有优秀工程(JIT编译器,垃圾收集算法,优化的执行环境等)

  • 我害怕这样一个问题可能导致的答案.感谢您创造这样一个完美的答案! (3认同)

dby*_*rne 11

由于Clojure的宏系统,我更喜欢使用Clojure来编写DSL.此外,我更喜欢Clojure用于某些类型的并发系统.Clojure对软件事务内存的本机支持与Scala的actor模型完全不同.

Clojure对面向对象编程没有很大的支持.对于面向对象范例运行良好的项目,或者您将严重依赖Java库/框架,我更喜欢Scala.

  • 请注意,[Akka](http://akka.io/)为Scala/Java提供了类似的[STM支持](http://akka.io/docs/akka/1.2/scala/stm.html). (6认同)
  • 很好的答案,虽然Scala更适合更自然(更少(括号))的DSL. (2认同)
  • @Duncan - 请注意,除了你将它们包装在内的宏/函数调用之外,Clojure DSL不需要任何括号.您可以轻松编写一个类似于(solve-equation-roots [x]"0.5x ^ 3 - 6x ^ 2 + 2x -1 = sin x")的DSL (2认同)
  • @Duncan - 你可以做任何你喜欢的事情,例如使用像fnparse(https://github.com/joshua-choi/fnparse)之类的东西从BNF语法构造任意复杂度的AST.Clojure宏系统的重点在于您可以在编译时使用整个语言来转换代码,因此您可以解析您选择的任何DSL语法.当然,为了成为惯用语和解析的简单性,在这种情况下选择Lisp风格的s表达式是正常的,我的观点是没有任何内在的强迫你为DSL选择这样的表示法. (2认同)