Elixirの記述に慣れるため、exercism.ioで簡単な問題を解きながら時間の合間に遊んでいます。
そこで少しエラーを何回も出してしまったのでメモ。
以下の通り、Elixirではguard clausesの中におけるbooleanの式ではand or not を使う必要があるみたいですね。
Note that while boolean operators such as
and,or,notare allowed in guards, the more general and short-circuiting operators &&,||and!are not.
from: http://elixir-lang.org/getting-started/case-cond-and-if.html
他言語だとビット演算云々で私は || とか && を使うことに慣れていたのでつまづいてしまった…
あと、同じように以下の[ここ]と書いている箇所。判定を読みやすくするために独自の関数を作ってみたのですが、guard clausesの中ではそのような独自な関数はちゃんとマクロ組んで作らないといけないのですね。
case example do x when [ここ] -> 処理 end
あらかじめこのwhenの中で使える関数が用意されていますが、それを超えるものはマクロ組んでいく必要があるみたい。ただ、それは可読性を損なう恐れのあるものなので、個人的には case example do のexampleをうまいこと表現したいですねー。
もう1個。以下のようなcaseを使った関数、パターンマッチを組み合わせた関数でも記述することができます。
- case文
def leap_year?(year) do
case year do
rem when rem(year, 400) == 0 -> true
rem when rem(year, 100) == 0 -> false
rem when rem(year, 4) == 0 -> true
_ -> false
end
end
- パターンマッチ
def leap_year?(year) when rem(year, 400) == 0, do: true def leap_year?(year) when rem(year, 100) == 0, do: false def leap_year?(year) when rem(year, 4) == 0, do: true def leap_year?(_), do: false
whenの中に記述できる処理式には限りがあるので、複雑な分類であれば case を使うほうがよさそうですが、簡単な when で区分できる場合、関数自体を分けたほうが責務が明確になってよさそう。
個人的には、パターンマッチで関数を分ける => case文で処理を分ける、という優先順位で処理を考えるときの思考が定着してきた感じ。