if 修飾子(postfix if)をめぐって
たぶん直接影響されたのは Perl からだろうけど、Ruby には if 修飾子があるけど、やはりこれは見た目以外にも影響を与えることがある
たとえば、Ruby の if 〜 then 〜 else 〜 end は文というより式なので、3 項の条件演算子 ? : は見た目にわかりづらいし if に書き換えてしまえばよさそう……と思えるのだが、文法的に if 修飾子があるために話がややこしくなることがある
簡単な階乗の計算を例にしてみる
? と : で書くと、
def fact(n) if n < 0 then raise end return n == 0 ? 1 : n * fact(n - 1) end
これの条件演算子の部分を if にする場合、次のようにカッコを付けなければならない
def fact(n) if n < 0 then raise end return (if n == 0 then 1 else n * fact(n - 1) end) end
C 言語では「return 《式》;」の《式》はカッコで囲むな、とされたりするが、そして Ruby の一般的な慣習としても普通はここにカッコを付けないが、if をここで式として使おうとするとカッコを付ける必要がある。文脈的に必ずしも式が必要とされない場所の場合(return の後には式がないこともある)、そこに if があると、if 修飾子として扱われてしまい、then で構文エラーになる
(PEG なら then の出現で、後置 if としてのパースが失敗して、if 式にフォールバックできるか?)
(追記: この例の場合、return を書かなくても、最後の式がメソッドの返す値になるので、そうすればカッコはいらなくなります)