Elm 0.11 改进与 JavaScript 的互操作

阅读数:894 2014 年 3 月 11 日

话题:函数式编程语言 & 开发

Elm最近的0.11 版本致力于简化FRP语言和 Javascript 的组合使用。为实现该目标,Elm 主要添加了两个功能:

  1. 能够创建组件(Component),组件是编译后的 Elm 代码,可以嵌入在 div 内。嵌入之后可以作为页面正常的一部分。
  2. 端口(Port)用于 JavaScript 和 Elm 之间的通信。消息会通过定义好的传入端口(in-port)传到 Elm 组件中,而应答通过订阅了传出端口(out-port)的回调函数来处理。

这两个元素结合在一起,为使用 Elm 的Haskell风格语法和创建可嵌入的 UI 组件和处理单元提供了支持。

2013 年 11 月,第一届Elm 研讨会在布达佩斯举行。Elm 的作者Evan Czaplicki在会上谈到了Elm 的未来。他指出,按照优先顺序,Elm 有四件需要处理的开发任务:

  1. 以库的方式分享。
  2. HTML 和 JavaScript 的集成。
  3. 使其他人可以方便地向 Elm 做出贡献。
  4. 尾递归优化。

应社区要求,他还演示了 Elm 的一个REPL(即 Read-Eval-Print Loop)原型。

Elm 的主页有很多 Elm 应用示例,我们可以与其互动。有一个很基础的马里奥(Mario)游戏,基本上是在Strange Loop 2013 会议上,在现场观众面前实现的,突出显示了 Elm 的图形功能。如果想看一个更实用的例子,可以看一下Todo 应用demo),它相当于 Web 框架的“Hello World”。如果想深入地了解一下 Elm 的理论基础,可以查看 Evan 的论文发表在 2013 年的“编程语言设计与实现会议”(Programming Language Design and Implementation Conference 2013)上。

InfoQ 就 Evan 在这些优先任务上的开发进度采访了他。

InfoQ在研讨会上,听上去您可能会集成Node Package Modules,以提供 Elm 的库解决方案,但是就能够将 Elm 模块与其余部分分离这点,您有所保留。您是不是设法解决了这个问题,还是说您决定采用不同方案了?

Evan我决定采用一种不同的方案,而且我很开心自己这么做了。Elm Public Library是最近发布的,它使得以库的方式分享程序非常容易。它也是通过 GitHub 提供的,不过对 Elm 用户而言,从头构建也是很愉快的体验。它使我可以自由地提供易于搜索的文档用 Elm 编写的)。宣告中更深入地谈到了技术决策和路线图,但重点是,我们现在可以分享库了!

InfoQ2012 年,您希望 Elm得到业界更多支持。您在Prezi工作的这种身份为您带来了所追求的东西吗?

Evan毫无疑问!在 Prezi 的工作对加速 Elm 的开发意义重大,但更重要的是,它使得我可以真正地专注于为业界用户准备好 Elm 的生态系统。这是我很久以来的目标,但是现在我有了一个友好且技术熟练的支撑团队,可以帮助我使目标成为现实。所以当我优先考虑某些特性或调整某个 API 时,总是有工程师乐于探讨并改进这些东西。我直接受到了 Prezi 的语言互操作基础设施的启发,从而有了 Elm 的端口(port ),进而使得 Elm/JS 可以简单无缝地进行互操作了。

InfoQElm 现在的路线图是什么样的?

Evan0.11 版本中的端口和即将到来的彻底修订的 Graphics.Input,让我感觉 Elm 已经非常接近产品状态了。今年夏天,我们会将精力集中于进一步发掘运行时的性能,支持尾递归优化,以及改进调试与 IDE 支持。致力于优化和工具,表明我们总体上在向支持产品用户转变,而不是继续把精力投在语言本身上。

与此同时,Prezi 内部已经在使用 Elm。这种情况让我非常开心。到目前为止,我主要观察到的是,组件模型在实践中表现非常好。有些组件用 Elm 编写很不错,而且现在我们可以很方便地将其集成到更大的 JS 或 TypeScript 项目中。实际上我们在 Prezi 打算找一位开发者,让他编写更多 Elm 代码,我认为这将是一个可以证明 Elm 已经为业界使用做好准备的一个考验。

查看英文原文:Elm 0.11 Improves JavaScript Interop