Elixir (プログラミング言語)

Elixir (エリクサー) は並行処理の機能や関数型といった特徴を持つ、Erlangの仮想マシン (BEAM) 上で動作するコンピュータプログラミング言語である。ElixirはErlangで実装されているため、分散システム、耐障害性、ソフトリアルタイムシステム等の機能を使用することができるが、拡張機能として、マクロを使ったメタプログラミング、そしてポリモーフィズムなどのプログラミングパラダイムもプロトコルを介して実装されている。

歴史
高い拡張性があり、Erlangの仮想環境上で動作するシステムを目標に、José Valimによって開発された。

特徴

 Erlangの仮想環境 (BEAM) 上で動作する
 Erlangの関数を呼び出せるため、Erlangのシステムにシームレスに統合できる
 LISPのマクロと抽象構文木によるメタプログラミング
 Clojureのようなプロトコルによるポリモーフィズム
 ファーストクラス・ドキュメント
 メッセージ交換アクターモデルによるシェアード・ナッシング・アーキテクチャを採用
 副作用が起こる循環構造の代わりに、再帰や高階関数に重点を置く
 構文は全て式として扱われる
 遅延評価と非同期処理
 パターンマッチング
 標準でUTF-8ユニコードを採用

 例 
以下のサンプルはiexシェルまたはファイルに保存した上で elixir <filename> コマンドにて実行可能である。

Hello world

iex> IO.puts "Hello World!"
Hello World!

内包表記
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"

モジュール
defmodule Fun do
  def fib(0), do: 0
  def fib(1), do: 1
  def fib(n) do 
    fib(n-2) + fib(n-1)  
  end
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

 脚注 

 参考文献 
 Dave Thomas：「プログラミングElixir」、オーム社、ISBN 978-4-274-21915-3（2016年8月19日）。
 Dave Thomas：「プログラミングElixir」（第2版）、オーム社、ISBN 978-4-274-22637-3（2020年12月)。

 外部リンク 


 Elixir - A modern approach to programming for the Erlang VM video presentation 

Category:プログラミング言語