JS と Elixir の比較: if...else 文と if マクロ (1)
本稿では、JavaScript の if...else 文と Elixir の if マクロを比較します。
JavaScript の if...else 文の基本的な構文は次の通りです。
if (条件式) {
A
} else {
B
}
「条件式」が成立したら A が実行され、そうでなければ B が実行されます。何をもって条件式が成功したとされるのかは少しややこしいです。JavaScript では以下の値が「偽とみなされる値(falsy value)」です。
false, 0, -0, 0n, "", null, undefined, NaN
「条件式」がこれらの値を返さなければ条件式が成立します。
Elixir には「条件文」という概念はありません。しかし、類似の働きをする if マクロ が存在します。「マクロ」という言葉については気にせずに読み進めてください。
if マクロ は次のように利用します。
if 条件式 do
A
else
B
end
「条件式」が成立したら A が評価され、そうでなければ B が評価されます。Elixir では以下の値が「偽とみなされる値」です。
false, nil
「条件式」がこれらの値を返さなければ条件式が成立します。
私は、JavaScript の if...else 文については「実行」、Elixir の if マクロについては「評価」という言葉を使いました。この言葉の使い分けには重要な意味があります。プログラミングにおいて「評価する(evaluate)」とは、式の値を決定するという意味です。
次の Elixir のプログラムをご覧ください。
x = 100
y =
if x > 0 do
"A"
else
"B"
end
IO.puts(y)
このプログラムにおいて、if から end までの部分がひとつの「式」を構成します。条件式 x > 0 が成立するとき、この式の値が "A" と評価され、それが変数 y にセットされます。条件式 x > 0 が成立しないときは、"B" が変数 y にセットされます。このプログラムを実行するとターミナルには A と出力されます。
他方、JavaScript の if...else 文では次のようには書けません。
const x = 100
const y =
if (x > 0) {
"A"
}
else {
"B"
}
console.log(y)
if のところで構文エラーが発生します。if...else 文はプログラムの流れを制御するためのものです。文全体が評価されて値を返すようには作られていません。
そこで、次のように書く必要があります。
const x = 100
let y
if (x > 0) {
y = "A"
}
else {
y = "B"
}
console.log(y)
ところで、JavaScript にも Elixir の if マクロと同様の働きをする構文があります。条件 (三項) 演算子です。これを用いると、直前のプログラムは次のように書き換えることができます。
const x = 100
const y = x > 0 ? "A" : "B"
console.log(y)
条件 (三項) 演算子は、? と : という2つの記号から構成される風変わりな演算子です。? の左に条件式を書き、? と : の間に条件式が成立したときに評価される式、: の右に条件式が成立しないときに評価される式を書きます。
Discussion