#この記事は
「すごいErlang楽しく学ぼう」(以下、すごいE本)をElixirで翻訳する異を通して、並行アクター指向を何となく理解しようという試みです。
すごいE本をElixirでやる(2章)に刺激されて自分もやってみようと思いました。
ソースコードはこちらです。
#環境
以下の環境で作成しました。
- Erlang : R16B01
- Elixir : 0.12.4
#準備
mixを使います。
super visorが登場するまでは、--bareオプションを使用します。
$ mix new elixir_application --bare
これで、コンパイル
$ mix compile elixir_application
あるいは、テスト
$ mix test
#以下、書きながら気づいたこと
5.1 再帰の動き
1行で書く場合は、do:の前にカンマが必要。
def fac(0), do: 1
def fac(n) when n > 0, do: n * fac(n-1) # arguments should not start Upper Char
def fac(_), do: "error"
公開する関数はdef。非公開の関数はdefpで宣言、def privateで覚える。でも、def publicとも解釈できて紛らわしい。
def tail_fac(n), do: tail_fac(n, 1)
defp tail_fac(0, ans), do: ans
defp tail_fac(n, ans), do: tail_fac(n-1, ans*n)
##5.2 さらに末尾関数
Elixirについて新しい内容はないので省略。
##5.3 リストを超えて
1ファイル内に複数のモジュールを宣言可能。
defmodule Recursive do
# (...中略...)
end
defmodule Tree do
# (...中略...)
end
これはテストファイルも同様です。複数のモジュールを定義しても、自動的に全て実行してくれます。
defmodule RecursiveTest do
use ExUnit.Case
# (...中略...)
end
defmodule TreeTest do
use ExUnit.Case
# (...中略...)
end
変数の前に:を追加することでアトムになる。
def empty(), do: {:node, :nil}
Erlangのモジュールを使用する
Erlangのモジュール名をアトムとしてインポートすれば、モジュール名は省略できます。
import :gb_trees
defmodule TreeTest do
use ExUnit.Case
# (...中略...)
test "use gb_trees that is one of erlang std library" do
empty = empty() # use erlang std module
# :gb_trees.empty() # "import :gb_trees"を書かない場合はこの様に記載する。
assert(empty == {0, :nil})
end
# (...以下略...)
感想
Erlangで煩わしいと感じていた、モジュール先頭での定義がないのがうれしいです。
サクサク書いて、後から公開/非公開を変更することも簡単です。
次回は、第7章をやっていこうと思います。第6章は省略します。