LoginSignup
6

More than 5 years have passed since last update.

すごいE本をElixirで演習する(第5章 再帰さん、こんにちは!)

Last updated at Posted at 2016-02-06

この記事は

「すごい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:の前にカンマが必要。

lib/recursive.ex
  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とも解釈できて紛らわしい。

lib/recursive.ex
  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ファイル内に複数のモジュールを宣言可能。

lib/recursive.ex
defmodule Recursive do
# (...中略...)
end

defmodule Tree do
# (...中略...)
end

これはテストファイルも同様です。複数のモジュールを定義しても、自動的に全て実行してくれます。

test/recursive_test.exs
defmodule RecursiveTest do
  use ExUnit.Case
# (...中略...)
end

defmodule TreeTest do
  use ExUnit.Case
# (...中略...)
end

変数の前に:を追加することでアトムになる。

lib/recursive.ex
  def empty(), do: {:node, :nil}

Erlangのモジュールを使用する
Erlangのモジュール名をアトムとしてインポートすれば、モジュール名は省略できます。

test/recursive_test.exs
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章は省略します。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6