elixir 简介

函数式编程 · kaelzhang · 于 发布 · 最后由 hkliya回复 · 781 次阅读
5

什么是elixir?

改进代码组织能力的类erlang语言
表面上像ruby,实际更接近于erlang

编程语言的角色:

  1. 允许程序员控制某物的接口,例如:硬件、虚拟机、运行的应用、UI布局等;
  2. 形成程序员建模这个世界的方式。OO语言让我们去寻找具有状态的实体和行为;FP语言让我们思考数据和转换;声明式语言迫使我们考虑规则;命令式语言让我们更多的思索行为序列;
  3. 向开发者提供组织代码的工具。

erlang和elixir在前两个角色上是完全一致的,他们面向相同的“事物”(EVM),并且都采用了函数式方法。但在第三者角色上elixir改进了erlang,它提供了一些额外的工具来组织代码,并更加高效地编写有生产力和可维护的代码。

一些特性

元编程

拿elixir的宏来举例:

    defrecord User, name: nil, age: 0

elixir的宏不像C/C++仅限于字符替换,是编译时的AST转换,由于是编译时的因此在实际运行时效率是不会被影响的。
elixir中的if和unless都是通过宏来实现的。

管道操作

没有管道时:

    State1 = trans_1(State)
    State2 = trans_2(State1)
    State3 = trans_3(State2)

or 内联表达

    trans_3(
        trans_2(
            trans_1(State)
        )
    )

有了管道操作后:

    state
    |> trans_1
    |> trans_2
    |> trans_3

突显了函数式编程的威力(数据转换),举个实际例子:

    list
    |> Enum.filter(&(&1 > 0))       # take positive numbers
    |> Enum.map(&(&1 * &1))         # square each one
    |> Enum.reduce(0, &(&1 + &2))   # calculate sum

根据协议的多态性

类似与OO的接口,允许开发人员创建一个适用任何类型数据的通用逻辑。例如Enum模块向可枚举的任何数据(列表、字典及自定义可枚举类型)都提供了很多有用的功能。

    Enum.each(enumerable, fn -> ... end)

举个实际例子:

    -10000..10000
    |> Stream.filter(&(&1 > 0))
    |> Stream.map(&(&1 * &1))
    |> Enum.reduce(0, &(&1 + &2))   # Entire iteration happens here in a single pass

取-10000至10000列表,过滤大于0的值,平方,然后相加。这里不进行详细解释。

Mix工具

管理elixir工程的工具,可以建立各种应用(简单应用、监控应用、伞应用),管理依赖、管理应用配置及自定义Mix任务等等。

语法上的变化

变量重新绑定,可选圆括号,隐式语句结束,可空,短流程操作(short circuits operators)等等。

    defrecord User, name: nil, age: 0       # without parentheses

    defrecord(User, [name: nil, age: 0])    # with parentheses

原文地址:http://kaelzhang81.github.io/%E4%B8%BA%E4%BD%95%E6%98%AFelixir/


「软件匠艺社区」旨在传播匠艺精神,通过分享好的「工作方式」和「习惯」以帮助程序员更加快乐高效地编程。
本帖已被设为精华帖!
共收到 1 条回复
1
hkliya · #1 ·

第一次听说 Elixir 是从 Juven 那里。

需要 登录 后回复方可回复, 如果你还没有账号你可以 注册 一个帐号。