/var/log/messages

Jan 12, 2019 - 1 minute read - Comments - programming

プログラミング Elixir (3)

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 じゃないと駄目なはずなんですが。

次の問題

検討しつつ力尽きる方向です。