Elm与ClojureScript相比如何?

42

我已经到达了使用Backbone.js面向对象MVC模式进行GUI编码变得相当复杂的地步,现在正在寻找其他编程范例。MDVFRPECS等。

Elm如何与ClojureScript进行比较?它们有哪些重叠之处?

这两种语言都与JS非常不同,它们可以编译成JS。我知道Elm是一种函数响应式编程(FRP)语言。ClojureScript并不一定是FRP,但你可以用它来进行FRP编程。Elm是用Haskell编译的,而ClojureScript是用JVM编译的,因此对于Node商店,这两者都需要额外的要求。

也许最终简单地归结为Clojure vs Haskell


1
这个问题可能会提供一些帮助:https://dev59.com/RmUp5IYBdhLWcg3wJU5J - thSoft
3个回答

46

两者都强制使用比纯 JS 更声明式和函数式的编程风格。ClojureScript更像是JS的替代品,而Elm更像是整个Web开发堆栈(HTML/CSS/JS)的替代品。

其他区别:

  • Elm语法更像Haskell
  • ClojureScript更接近传统的Lisp语法
  • Elm高度优化了时变值(在Elm中称为"signals")
  • ClojureScript更成熟,可以找到一些甜美的开发工具(Eclipse插件,LightTable等)
  • Elm是静态类型的,ClojureScript是动态类型的

希望这有所帮助。我仍在学习这两种语言,可能会遗漏某些内容。


7
这句话最重要的不同点在于类型。ClojureScript 是动态类型的,非常灵活,但 Elm 是静态类型的,不太灵活,却几乎消除了所有未被捕获的运行时错误。 - jmite
@jmite 说得好,我更新了我的答案。虽然我会认为这不是最大的区别,但它仍然是一个很大的区别。 - Alex Shroyer

18

仅更新至2017年。

Elm不再是FRP,几个版本之前为了支持Elm架构而被淘汰。

Elm的主要优点是具有静态类型系统,编译器可以在编译时做出许多关于程序正确性的断言。例如,您可以确信永远不会出现情况,其中case语句没有涵盖特定情况。或者视图函数中的HTML将产生update不知道如何处理的事件。

其他Elm优势

  • 错误提示很好
  • 包已强制遵守语义化版本控制*
  • 包和工具通常具有明显的名称

*语义化版本控制是一种描述规范的约定。它是形式为major.minor.patch的数字版本标识符,可以像2.3.4 <= 2.5.0这样进行比较,因此开发人员可以一眼看出所做的更改种类。

在Elm中,如果FooModule 4.2.3对函数引入了不向后兼容的更改(Foo : Int -> Bool变为Foo : Int -> String -> Bool),则除非将主版本号也增加以表示破坏性更改(例如,可以上传为FooModule 5.0.0),否则该包将不被接受到官方存储库中。在Elm 0.14中,引入了elm-package工具来强制执行此规则。


什么是“语义化版本控制”,为什么它很重要?非常感谢提供现实世界的例子。谢谢。 - devdanke

7
它们的核心都是FRP(Functional Reactive Programming)- 意味着它们有一个DOM树,并且只呈现需要被呈现的组件或子组件。(正如之前有人指出的,Elm已经放弃了FRP原则来追求自己的想法)
它们都编译成JavaScript(虽然通过ClojureScript/Om库或Reagent可以在js中获得实际的React对象),而Elm则做了自己的事情。我不喜欢Elm必须通过npm安装,尽管据我所知czapliki正在开发一个独立的安装程序。
在我看来,Elm更好,因为它比较友好地管理状态,具有非常好的(正如之前提到的)类Haskell语法,还可以将RuntimeErrors转换为CompileTimeErrors,这对于开发人员更加合适,而且代码可维护性更高。
另一方面,cljs有很多库-其中一些(如我提到的cljs/Om)返回实际的React组件,其他则仅仅遵循FRP和生命周期思想而没有被其拖累。也许应该看一下Om/Next,它具有从终端点调用数据的GraphQL方式,并且已经放弃了普通cljs/Om中使用的异步通道。
说实话,这是个口味问题,但我个人更喜欢Elm(已经用过这两种语言)。不过,如果你使用cljs,请确保获取一个好的库,并且不要在vanilla cljs中处理东西,否则当你想维护5k+LOC时会很抱歉。(查找Fulcro、Reagent、om、OmNext、Hoplon等)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接