前回は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 |