Fork me on GitHub

elixir简介

why elixir

Posted by Kaelzhang on November 2, 2015

img

什么是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://theerlangelist.com/article/why_elixir


  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!