Elixir
Elixir是一个基于Erlang虚拟机的函数式、面向并行的通用编程语言。Elixir以Erlang为基础,支持分布式、高容错、实时应用程序的开发,亦可通过宏实现元编程对其进行扩展,并通过协议支持多态。[2]
编程范型 | 多范式:函数式、并行式、面向进程、同像性 |
---|---|
发行时间 | 2012年 |
当前版本 |
|
类型系统 | 动态类型、强类型 |
许可证 | Apache License |
文件扩展名 | .ex、.exs |
网站 | elixir-lang |
启发语言 | |
Clojure、Erlang、Ruby |
历史
José Valim是Elixir语言的设计者。他创造该语言的目标是在维持与现有Erlang工具链及生态环境兼容性的同时,让人们可以在Erlang虚拟机上进行扩展性更好的、高生产率的开发。[3]
特性
- 基于Erlang虚拟机(BEAM)。
- 与Erlang语言的无缝衔接;与Erlang的互调几乎无任何额外开销。
- 基于宏的元编程能力,语言的抽象语法树作为头等公民。
- 基于协议的多态实现。受到Clojure启发,协议提供了动态分派机制。但是不可混淆于多分派,因为Elixir协议在一个单一类型上进行分派。
- 完善的文档支持。
- 通过消息传递(演员模型)支持 Shared-nothing 并行事务。
- 强调利用递归和高阶函数的函数式编程胜过基于副作用和循环的命令式编程。
- 一切均为表达式。
- 惰性求值,拥有诸如futures和promises一类的异步流数据类型。
- 模式匹配。
- Unicode支持,UTF-8字符串。
示例
以下示例可以在iex shell中运行或保存在文件中,并通过命令行键入命令运行 elixir <filename>
.
经典的 Hello world 例子:
iex> IO.puts("Hello World!")
Hello World!
Enumerable 推导
iex> for n <- [1,2,3,4,5], rem(n, 2) == 1, do: n*n
[1, 9, 25]
模式匹配(解构)
iex> [1, a] = [1, 2]
iex> a
2
iex> {:ok, [hello: a]} = {:ok, [hello: "world"]}
iex> a
"world"
模式匹配(多子句)
iex> case File.read("path/to/file") do
iex> {:ok, contents} -> IO.puts("found file: #{contents}")
iex> {:error, reason} -> IO.puts("missing file: #{reason}")
iex> end
管道操作符
iex> "1" |> String.to_integer() |> Kernel.*(2)
2
模块
defmodule Fun do
def fib(0), do: 0
def fib(1), do: 1
def fib(n), do: fib(n-2) + fib(n-1)
end
顺序产生1000个进程
for num <- 1..1000, do: spawn fn -> IO.puts("#{num * 2}") end
执行异步任务
task = Task.async fn -> perform_complex_action() end
other_time_consuming_action()
Task.await task
参考资料
- ^ 1.0 1.1 Release 1.14.3. 2023年1月14日 [2023年2月11日].
- ^ Elixir. José Valim. [2013-02-17]. (原始内容存档于2017-09-30).
- ^ Elixir - A modern approach to programming for the Erlang VM. [2013-02-17]. (原始内容存档于2012-11-29).
外部链接
- Elixir language website(页面存档备份,存于互联网档案馆)
- Code on GitHub(页面存档备份,存于互联网档案馆)
- Elixir School(页面存档备份,存于互联网档案馆)
- Elixir - A modern approach to programming for the Erlang VM video presentation(页面存档备份,存于互联网档案馆)
- Dave Thomas: "Programming Elixir: Functional |> Concurrent |> Pragmatic |> Fun" (book)
- Simon St. Laurent, J. David Eisenberg: "Introducing Elixir" (book)(页面存档备份,存于互联网档案馆)
- Joe Armstrong: "A Week with Elixir" (blog entry)
- Erlang之父学习Elixir语言的一周(页面存档备份,存于互联网档案馆)