引き続きこの書籍を読んでいます
Programming Elixir: Functional |> Concurrent |> Pragmatic |> Fun
- 作者: Dave Thomas
- 出版社/メーカー: Pragmatic Bookshelf
- 発売日: 2014/11/13
- メディア: Kindle版
- この商品を含むブログを見る
第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