読者です 読者をやめる 読者になる 読者になる

Elixir のはじめ方


f:id:Naotsugu:20150804004457p:plain

導入

Homebrew での導入は以下。

brew update
brew install elixir

バージョン確認。

$ elixir -v
Elixir 1.0.4

Erlang も入る。

erl -version
Erlang (SMP,ASYNC_THREADS,HIPE) (BEAM) emulator version 6.4

IEx (Interactive Elixir)

対話型シェルで、各種操作が実行できる。

$ iex
Interactive Elixir (1.0.4) - press Ctrl+C to exit (type h() ENTER for help)
iex>

REPL として直接コードを実行したり、

iex> 1 + 1
2

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

コンパイルしたり

iex> c "my_file.ex"

Enum モジュールに定義されている型の情報を見たり

iex> t Enum

ドキュメント見たり

iex> h(IO.puts/1)

                def puts(device \\ :erlang.group_leader(), item)

Writes the argument to the device, similar to write/2, but adds a newline at
the end. The argument is expected to be a chardata.

モジュール名.関数名/arity の形式で、arity は引数の数となる。


IExのヘルプは以下で見れる。

iex> h(IEx)

コンパイルと実行

コンパイラは elixirc スクリプトの実行は elixir というコマンドが用意されている。

拡張子との対応は慣例として以下。

用途 コマンド 拡張子
対話型シェル iex -
スクリプト elixir .exs
コンパイル elixirc .ex

スクリプトの実行は 拡張子 .exs のファイルを elixir で実行。

コンパイルは .ex のファイルを elixirc でコンパイルすると Elixir.モジュール名.beam という名前の Erlang VM の beam ファイルができる。

beam ファイルの実行は以下でできる。

elixir -e モジュール名.関数名

Hello World

hello_world.exs というスクリプトファイルを作る。

IO.puts "Hello world."

実行は elixir コマンドで以下のように実行できる。

$ elixir hello_world.exs
Hello world.


コンパイルする場合には hello_world.ex を以下のように作る。

defmodule Hello do
  def hello do
    IO.puts "Hello World"
  end
end

コンパイル

$ elixirc hello_world.exs

Elixir.Hello.beam ができ、elixir -e モジュール名.関数名 で実行できる。

$ elixir -e Hello.hello
Hello World!

iex を実行すると、カレントの beam が自動的にロードされるので以下のように実行できる。

iex(1)> Hello.hello
Hello World
:ok

mix

Elixir ではプロジェクト管理ツールとして Mix がついてくる。

コマンド 説明
mix new プロジェクト作成
mix test テストを実行
mix compile コンパイル
mix -help ヘルプ

新規プロジェクトを作成すると以下のようになる。

$ mix new example
* creating README.md
* creating .gitignore
* creating mix.exs
* creating config
* creating config/config.exs
* creating lib
* creating lib/example.ex
* creating test
* creating test/test_helper.exs
* creating test/example_test.exs

Your mix project was created successfully.
You can use mix to compile it, test it, and more:

    cd example
    mix test

Run `mix help` for more commands.

ディレクトリ構成は以下のようになる

.
├── README.md
├── _build
├── config
│   └── config.exs
├── lib
│   └── example.ex
├── mix.exs
└── test
    ├── example_test.exs
    └── test_helper.exs

ディレクトリとファイルの説明は以下。

コマンド 説明
_build ビルドによる成果物が格納される
config プロジェクトと依存設定などの設定ファイルが置かれる
lib アプリケーションのソースコードが格納される
mix.exs プロジェクト名やバージョン、依存などを定義する
test テストコードが格納される

mix.exs

プロジェクトの設定は mix.exs で管理される。

defmodule Example.Mixfile do
  use Mix.Project

  def project do
    [app: :example,
     version: "0.0.1",
     elixir: "~> 1.0",
     build_embedded: Mix.env == :prod,
     start_permanent: Mix.env == :prod,
     deps: deps]
  end

  def application do
    [applications: [:logger]]
  end

  defp deps do
    []
  end
end

2つのパブリック関数 project と application でプロジェクト全体の設定とアプリケーションファイル生成時の定義を行う。

プライベート関数の deps で依存関係を定義する。Hex パッケージや Git リポジトリが指定できる。

mix で コマンドラインHello World

先ほど作ったプロジェクトの example.ex を以下のようにする。

defmodule Example do

  def main([]) do
    IO.puts "Hello world."
  end

end

コンパイルして、

$ mix compile
Compiled lib/example.ex
Generated example app

実行。

$ mix run -e "Example.main([])"
Hello world.

iex から起動することもできる。

$ iex -S mix
iex(1)> Example.main([])
Hello world.


コマンドラインから実行するには mix.exsescript: [ main_module: Example ] のようにメインモジュールを指定する。

  def project do
    [app: :example,
     version: "0.0.1",
     elixir: "~> 1.0",
     build_embedded: Mix.env == :prod,
     start_permanent: Mix.env == :prod,
     deps: deps,
     escript: [ main_module: Example ]]
  end

以下のようにすると、ルードディレクトリに example という実行可能ファイルができる。

$ mix escript.build

コマンドラインから実行できる。

$ ./example
Hello world.

次回はPhoenix編。

Elixir の RoR 風フレームワーク Phoenix のはじめ方 - A Memorandum



Introducing Elixir: Getting Started in Functional Programming

Introducing Elixir: Getting Started in Functional Programming