🪄
JS と Elixir の比較: if...else 文と if マクロ (2)
前回の記事の続きです。JavaScript の if...else
文と Elixir の if
マクロを比較します。
JavaScript の if...else 文は次のように else
以下を省略できます。
if (条件式) {
A
}
「条件式」が成立したら A が実行され、そうでなければ何も起きません。
同様に、Elixir の if
マクロでも else
を省略できます。
if 条件式 do
A
end
「条件式」が成立したら A が評価されて式 if ... end
全体の値となります。
重要なのは、「条件式」が成立しない場合は nil
が式全体の値となるということです。つまり、上記のプログラムは次のものと同値です。
if 条件式 do
A
else
nil
end
false
が式全体の式になると誤解しないよう注意してください。
JavaScript の if...else
文では次のように else if
を用いて複数の条件式による分岐を実現できます。
if (条件式1) {
A
}
else if (条件式2) {
B
}
else if (条件式3) {
C
}
else {
D
}
以下のように処理が進みます。
- 「条件式1」が成立したら A が実行される。
- 「条件式1」が成立せずに「条件式2」が成立したら B が実行される。
- 「条件式1」と「条件式2」が成立せずに「条件式3」が成立したら C が実行される。
- いずれの条件式も成立しなければ D が実行される。
意外に思われるかもしれませんが、Elixir の if
マクロには JavaScript の else if
に相当する書き方がありません。仕方がないので、次のように入れ子にして書くことになります。
if 条件式1 do
A
else
if 条件式2 do
B
else
if 条件式3 do
C
else
D
end
end
end
しかし、cond
マクロを使えば入れ子構造を使わずに書けます。
cond do
条件式1 -> A
条件式2 -> B
条件式3 -> C
true -> D
end
cond
マクロは if
マクロの上位互換です。本来、cond
マクロがあれば if
マクロは不要です。つまり、if
マクロは人間にとっての読みやすさのために導入された書き方、いわゆる糖衣構文(syntactic sugar)です。条件がひとつしかないときは if
マクロを使い、条件が複数あるときは cond
マクロを使うとよいでしょう。
Discussion