前回はiexのインタラクティブシェルに実行しました。はじめてRubyでコードを書いたときのような楽しさがあります。次はファイルに書いたモジュールをコンパイルして実行してみます。またEmacsのelixir-modeをインストールして開発環境を整備していきます。
開発環境
Docker Compose
前回と同様にElixirのコマンドはDocker Composeで実行します。
elixir: |
以下のようにiexサービスを使い捨てのコンテナで起動します。
$ docker-compose run --rm iex |
elixir-mode
少しずつElixirの開発環境を用意していきます。Docker Composeからカレントディレクトリをボリュームとしてコンテナの/app
ディレクトリにマップしています。DockerホストのEmacsでElixirのファイルを編集してコンテナで実行します。
emacs-elixirをCaskを使いEmacsにインストールします。
$ cd ~/.emacs.d |
コードの実行
Elixirはコードを実行するコマンドが3つあります。
- iex: インタラクティブシェルで実行
- elixirc: コンパイルして実行 (.ex)
- elixir: スクリプト実行 (.exs)
iexでインタラクティブ実行
ErlangやScalaなどと同様でElixirは純粋に関数だけを定義することができません。
$ iex |
関数はモジュールの内部に定義する必要があります。
iex(2)> defmodule MyModule do |
関数の実行は()
を省略することができます。この例のように引数がない場合は省略しても良いですが、引数がある関数の実行は()
を付けた方が読みやすくなります。
iex(3)> MyModule.hello |
hello関数をMyModuleに定義してmy_module.ex
ファイルを作成します。
defmodule MyModule do |
iexを起動してからモジュールをコンパイルとロードをします。
$ iex |
iexコマンドはモジュールが定義されたファイルを引数にするとコンパイルとロードができます。また、カレントディレクトリにコンパイル済の.beam
ファイルがある場合は自動的にロードされます。以下のようにiexコマンドで同じ名前のモジュールを再度コンパイルした警告がでますが、この場合は無視できます。
$ ls Elixir.MyModule.beam |
elixircでコンパイル
elixircコマンドでモジュールファイルをコンパイルして、Elixir.モジュール名.beam
の中間ファイルを作成します。
$ elixirc my_module.ex |
コンパイルした.beam
ファイルのモジュールは、先ほどのようにiexやmixコマンドでロードすることができます。
elixirでスクリプト実行
ex
とexs
は拡張子が違っても動作に影響はありません。スクリプトの場合.exs
と拡張子を付けるようです。my_module.exs
はファイル内で定義したモジュールの関数を実行しています。
defmodule MyModule do |
elixir
コマンドで実行すると.beam
中間ファイルを生成せずにコンパイルして実行します。
$ elixir my_module.exs |