Io言語の if then else の実現方法がかっこいい

Io っていうプログラミング言語の if then else の実現方法がむちゃくちゃかっこよかったのでメモ。

まず if then elseの見ためはこんな感じ。

if( 4 % 2 == 0 ) then( "偶数" print ) else( "奇数" print )

この場合は、4を2で割った余りが0なら「偶数」と表示され、そうでないなら「奇数」と表示される。この if then else はこういう構文があるわけじゃなくて、メソッドチェインで実現されてる。そこがかっこいい!

具体的には上のコードはこんなふうに評価される。まず先頭の if( 4 % 2 == 0 ) は実は if メソッドを引数「4 % 2 == 0」で呼び出すという意味で、4 % 2 == 0 は真なので true オブジェクトが返る。なのでこうなる。

true then( "偶数" print ) else( "奇数" print )

つぎに true then( ”偶数” print ) が評価される。これは true オブジェクトのthenメソッドを引数「”偶数” print」で呼び出すという意味だ。これは引数を評価したうえで nil を返す。まず、引数の「”偶数” print」は「偶数」という文字列のprintメソッドを呼び出すという意味なので、「偶数」という文字が表示される。そのうえで nilが返るからこうなる。

nil else( "奇数" print )

これまで同様、これは nilオブジェクトに対する elseメソッドの呼び出しになるんだけど、nilはelseメソッドに対してなにもしないので、「奇数」という文字は表示されない。これで if then else がみごとメソッドチェインで実現されたことになる!

なお、ふつうの言語なら上の例で elseメソッドに引数「”奇数” print」が与えられたら、まず引数を評価してから elseメソッドの本体に渡すので、「奇数」はどうしても表示されちゃう。Io の場合は引数の評価が遅延されるのでこういううまいことができる。

ちなみに else と then を逆に書いても問題なくうごく。つまり、

if( 4 % 2 == 0 ) else( "奇数" print ) then("偶数" print )

と書いても大丈夫!具体的に評価を追って行くと、さっきと同じように冒頭の if がまず true になる。

true else( "奇数" print ) then("偶数" print )

trueオブジェクトにelseを呼ぶと、引数を無視して単にtrueオブジェクトを返すから、

true then("偶数" print )

こうなる。これはさっきもやったとおり “偶数” と表示されるので、これで終わり。なるほどーって感じだ。

if then else が制御構造じゃなくてメソッドだっていうのはどうやら Smalltalk に由来していて、それっぽい ifTrue() とか ifFalse() っていう書き方も別にあるようなんだけど、ぜったいこっちの if() then() else() のほうがかっこいいと思う。