什么是elixir?
改进代码组织能力的类erlang语言 表面上像ruby,实际跟接近于erlang
编程语言的角色:
- 允许程序员控制某物的接口,例如:硬件、虚拟机、运行的应用、UI布局等;
- 形成程序员建模这个世界的方式。OO语言让我们去寻找具有状态的实体和行为;FP语言让我们思考数据和转换;声明式语言迫使我们考虑规则;命令式语言让我们更多的思索行为序列;
- 向开发者提供组织代码的工具。
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 许可协议。转载请注明出处!