【问题标题】:What classes of problems is Clojure good/bad at solving vis-a-vis Scala?Clojure 相对于 Scala 解决哪些类型的问题好/坏?
【发布时间】:2011-11-28 21:43:41
【问题描述】:

这两种语言都是基于 JVM 的,对函数式编程具有强大的支持。我知道会有一大类问题,两种语言都可以提供出色的解决方案。我想知道的是,如果有任何特定类型的问题,Clojure 的特性会让它在对抗 Scala 和反之亦然。目前,我们在 Scala 中做了很多工作,但我想寻找特定的问题空间,Clojure 可能会提供更好的解决方案。

【问题讨论】:

    标签: scala clojure


    【解决方案1】:

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

    我仍然认为它们在几个领域各自具有独特的优势:

    Clojure 相对于 Scala 的特殊优势:

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

    Scala 相对于 Clojure 的特殊优势:

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

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

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

    【讨论】:

    • 我害怕这样的问题可能会导致的答案。感谢您创造了如此完美的答案!
    【解决方案2】:

    由于 Clojure 的宏系统,我更喜欢使用 Clojure 来编写 DSL。此外,对于某些类型的并发系统,我更喜欢 Clojure。 Clojure 对software transactional memory 的原生支持与Scala 的actor 模型完全不同。

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

    【讨论】:

    • 很好的答案,尽管 Scala 更适合更自然(更少(括号))的 DSL。
    • 请注意,Akka 为 Scala/Java 提供了类似的 STM support
    • @Duncan - 请注意,Clojure DSL 不需要任何括号,除了您将它们包装在里面的宏/函数调用。例如,您可以轻松编写一个 DSL,它执行类似 (solve-equation-roots [x] "0.5x^3 - 6x^2 +2x -1 = sin x") 的操作
    • @mikera 但是你不是只解释一个标记化的列表吗?我很想看到一个参考。
    • @Duncan - 你可以做任何你喜欢的事情,例如使用 fnparse (github.com/joshua-choi/fnparse) 之类的东西从 BNF 语法构造任意复杂度的 AST。 Clojure 宏系统的全部意义在于,您拥有可用于在编译时转换代码的整个语言,因此您可以解析您选择的任何 DSL 语法。当然,为了符合习惯和解析的简单性,在这种情况下选择 Lisp 样式的 s 表达式是正常的,我的观点是,没有什么本质上会强迫你为你的 DSL 选择这样的符号。跨度>
    【解决方案3】:

    Clojure 和 Scala 的一大优点是您可以在同一个地方两者同时使用它们,而且摩擦最小。我只建议在 Clojure 中进行大部分互操作,因为我认为它在那里有优势。

    两者都试一下,看看哪些问题和语言适合。您始终可以非常轻松地在同一系统中的 Java、Scala 和 Clojure 代码之间进行互操作。

    【讨论】:

    • JVM 上的语言之间的互操作。 IE。 Clojure 使用 Java、Java 使用 Scala、Scala 使用 Clojure 等
    • 这很奇怪。我经常听到有人声称 Clojure 具有更好的互操作性,但不幸的是,这从未得到任何实际事实的支持。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 2018-01-30
    • 1970-01-01
    • 2011-01-09
    • 2011-11-04
    相关资源
    最近更新 更多