Elixir (程式語言)
外觀
編程範型 | 多範式:函數式、並列式、面向行程、同像性 |
---|---|
釋出時間 | 2012年 |
目前版本 |
|
型態系統 | 動態型別、強型別 |
許可證 | Apache License |
副檔名 | .ex、.exs |
網站 | elixir-lang |
啟發語言 | |
Clojure、Erlang、Ruby |
Elixir是一個基於Erlang虛擬機器的函數式、面向並列的通用程式語言。Elixir以Erlang為基礎,支援分散式、高容錯、即時應用程式的開發,亦可通過巨集實現元程式設計對其進行擴充,並通過協定支援多型。[2]
歷史
[編輯]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.17.3. 2024年9月18日 [2024年9月21日].
- ^ 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語言的一周(頁面存檔備份,存於互聯網檔案館)