if式で気づいたこと

Lispはif式という偉大なる発明をした。

が、どういう訳か「if文」として世の中に広がっていってしまった。


来年に向けて、閏年でも判別してみる。

僕はLisp使えないのでSchemeで書きます(えへ

(define year 2007)
(if (= (remainder year 4) 0)
    (display "閏年です。")
    (display "閏年ではありません。")) ; 閏年ではありません

奇妙な事にSchemeのif式は値を返す。

(display
  (if (= (remainder year 4) 0)
    "閏年です。"
    "閏年ではありません。")) ;閏年ではありません

displayを外に出せてスッキリした。Schemeには構文が無い。全てが式である。

慣れるとifが値を返すことが自然に思えてくる。


で、イマイチ理解に苦しんでいたRubyのifがようやく理解できた。

year = 2007
puts (
  if (year % 4) == 0
    "閏年です"
  else
    "閏年ではありません。"
  end
)
# => 閏年ではありません

Rubyのifは値を返すので、Scheme風に書ける。そう、Rubyのifは「if式」なのだ。

やっと式と構文の違いを理解できるようになったと思う。


でも、普通はこう書かない。普通に書くなら、三項演算子

puts (year % 4) == 0 ? "閏年です" : "閏年ではありません。"
# => 閏年ではありません

Lispのif式は三項演算子としてひっそり生き残っている。

三項演算子ラブ。

注意

あ、ホントの閏年判別は、もうちょっと複雑です。