いろいろ発見メモ

さまざまな試行と実験と発見と調べ物のメモ書きです

Elixir のモジュールと名前付き関数

引き続きこの書籍を読んでいます

Programming Elixir: Functional |> Concurrent |> Pragmatic |> Fun

Programming Elixir: Functional |> Concurrent |> Pragmatic |> Fun

 

第6章で取り上げられるトピックは以下のものです。

 

  • モジュール(コードをまとめる基本単位)
  • パブリックならびにプライベート名前付き関数
  • ガードクローズ
  • モジュール指示(ディレクティブ)と属性(アトリビュート
  • Erlang モジュール内の関数の呼び出し

 

モジュールと名前付き関数

Elixir の名前付き関数はモジュールの中に定義されます。

defmodule Learn do
  def add2(n) do
    n + 2
  end
end

 Learn というモジュールの中に add2 という関数を定義しています。

これを iex からコンパイル&ロードして使うには(ファイル名は Learn.exs)以下のようにします。

iex> c "Learn.exs"
[Learn]
iex> Learn.add2 3
5

 演習問題解答

# Exercise: ModuleAndFunctions-1, 3

# モジュール名は Learn を使用

defmodule Learn do
  def add2(n) do
    n + 2
  end
  def double(n) do
    n * 2
  end
  def triple(n) do
    n * 3
  end
  def quadruple(n) do
    double(double(n))
  end
end

 名前付き関数呼び出し時の引数パターンマッチ

引数のパターンマッチで、実際に呼び出される関数が変わります。

階乗を計算するモジュール Factorial の定義例(書籍のものを参考に)

defmodule Factorial do
  def of(0) do 1 end
  def of(n) do n * of(n-1) end
end

 これを定義して Factorial.of(0) と呼び出すと、一行目にパターンマッチして 1 が返されます。 Factorial.of(10) といった呼び出しは二行目に再帰的にマッチして計算が進み、最後に一行目にマッチして計算が停止します。

iex> c "Factorial1.exs"
[Factorial]
iex> Factorial.of(1)
1
iex> Factorial.of(0)
1
iex> Factorial.of(3)
6
iex> Factorial.of(10)
3628800
iex> Factorial.of(100)
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000

 

演習問題解答

# ModulesAndFunctions-5

# 最大公約数の計算(ユークリッドの互除法

defmodule GCD do
  def gcd(x, 0) do
    x
  end
  def gcd(x, y) do
    gcd(y, rem(x, y))
  end
end