chapter 6 のモジュールと名前付き関数の章、練習問題を確認してみます。
Times module の定義は以下。
defmodule Times do
def double(n) do
n * 2
end
end
ModuleAndFunctions - 1
以下を追加して
def triple(n) do
n * 3
end
ModuleAndFunctions - 2
iex で実行、ファイルをコンパイルする二つの方法、ということで一つめが以下。
$ iex times.exs
Erlang/OTP 21 [erts-10.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe] [dtrace]
Interactive Elixir (1.7.3) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> Times.triple 3
9
あるいは以下。
$ iex
Erlang/OTP 21 [erts-10.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe] [dtrace]
Interactive Elixir (1.7.3) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> c "times.exs"
[Times]
iex(2)> Times.triple(3)
9
ModuleAndFunctions - 3
quadruple を定義せよ、とのこと。
def quadruple(n) do
double(double(n))
end
書き方間違えてるかな、と思いきやセイフでした。
iex(3)> c "times.exs"
warning: redefining module Times (current version defined in memory)
times.exs:1
[Times]
iex(4)> Times.quadruple(2)
8
ModuleAndFunctions-4
BadFactorial の定義を見ながら実装書いてしまい失敗するなど。実装は以下。
defmodule Summary do
def sum(0), do: 0
def sum(n), do: n + sum(n-1)
end
動作確認は以下なカンジにて。
iex(1)> c "summary.exs"
[Summary]
iex(2)> Summary.sum(10)
55
ModuleAndFunctions-5
ここでも微妙な書き方をしてしまい、ハマるなど。
defmodule Gcd do
def of(x, 0), do: x
def of(x, y), do: of(y, rem(x, y))
end
下側の of を以下な書き方してました。
def of(x, y), do: gcd(y, rem(x, y))
そもそも手続きの名前が gcd じゃないと駄目なはずなんですが。
次の問題
検討しつつ力尽きる方向です。