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 を書かなくても、最後の式がメソッドの返す値になるので、そうすればカッコはいらなくなります)