Elixirのコードは、BEAM仮想マシンで動きます。BEAMは、Erlangのランタイムシステムの一部です。Erlangに着想を得て、実行環境を共有しているElixirは、Erlangのライブラリと高い相互運用性を持っています。つまり、Elixirのエンジニアは、自分のElixirコードの中からErlangのライブラリを使うことができます。実際、Erlangのライブラリがすでに提供している機能のためにElixirのライブラリを書くことは、Elixirのコミュニティでは推奨されていません。
その結果、数学的な演算やタイマーの機能など、一部の機能は、ElixirではErlangを介してしか使えません。
ElixirとErlangのこの密接な関係から、一人前のElixirエンジニアになるには、Erlangの基本的な構文を学ぶことに少し時間をかけるとよいかもしれません。
Erlangの標準ライブラリは、特別な手順を踏むことなく、Elixirのコードからそのまま使えます。
Erlangの関数は、Elixirの関数を呼び出すのと同じように呼び出せますが、小さな違いが1つあります。Erlangのモジュール名はsnake_caseのアトムです。たとえば、mathモジュールのErlang関数pi/0を呼び出すには、次のように書きます。
:math.pi()
# => 3.141592653589793
よく使われるErlangモジュールは、Elixirの標準ライブラリに欠けている機能を提供してくれます。次のとおりです。
timerモジュールは、sleep/1、send_after/2、send_interval/2などの関数を提供します。randモジュールは、uniform/0、normal/0、seed/2などの関数を提供します。:io_lib.format/2は、C言語スタイルの文字列フォーマット(制御シーケンスを使います)を提供します。mathモジュールは、sin/1、cos/1、log2/1、log10/1、pow/2など、さまざまな数学関数を提供します。queueモジュールは、キューのデータ構造を提供します。cryptoモジュールは、暗号関連の関数を提供します。zipモジュールは、zipアーカイブを扱うための関数を提供します。calendarモジュールは、iso_week_number/1など、日付と時刻を扱うための関数を提供します。Erlangの関数にDate、Time、NaiveDateTimeの構造体を渡すには、対応するモジュールのto_erl関数を使ってErlangの形式に変換する必要があります。Erlangの標準ライブラリについて調べるには、STDLIB Reference Manualを見てみましょう。
ErlangのライブラリとのElixirの相互運用性は、Erlangの標準ライブラリにとどまりません。どんなErlangのライブラリでも、Elixirのコードで使うことができます。