2012年12月4日火曜日

irof文が実装できたよ。そう、Scalaならね!

いろふアドベントカレンダー の4日目です。

前日は、@megascus さんの「世界はいろふである #irof_history」でした。

さて、ITの某界隈ですっかり有名人になったirofさんですが、そろそろプログラム言語の構文として実装されてもいいのではないかと思うのです。だって、irofってifに似てるしね。

こんなイメージでしょうか。

  irof (hoge == 1) {
     println("いろふ")
  }

仕様はまぁ、面倒なのでif文と同じでいいでしょう。

if文が真であるときの制御があるなら、偽の場合の制御も必要です。if文が偽の場合はelseですから、ここはelofとしておきましょう。なんとなく変態っぽくて、そのまま変態アドベントカレンダーのネタにも使えそうですね。

イメージはこうなるでしょうか。

  irof(hoge == 1) {
    println("いろふ")
  } elof {
    println("おまえ、いろふじゃないな!?")
  }

プログラム言語っぽくなってきました。
さて、実装です。

irof文を、上記のイメージで完全再現するには、どうしましょうか。
Scalaなら、なんかやれそうな気がします。

さっそく実装してみましょう!!

Scalaは、def hoge (a: Boolean)(b: Int) のように引数リストを複数取れますから、この仕組みを使えばirof文のBooleanをとる引数と、blockをとる引数でそれっぽく実装できそうです。

ついでにirofをcase classにして2つの引数リストを取り、elofをそのメソッドとすれば、真の場合のブロックをコンストラクタで、偽の場合のブロックをelofメソッド内で実行するという形で、上記のirof文のイメージを完全再現できますね。

結果、下記のような実装になります。


できました!

これで、我々のよく知っているif文とまったく同じイメージで、irof文が使えます。

ただ、"irof"の実態はcase classであるため、これはirof文っぽく動くのですが、Scalaのifのような「irof式」ではありません。irof文の結果を引数に取ると、irofクラスのインスタンスを受け取ってしまいます。

このあたりが、どうにかならないかなー、と悔しいところではありますが、とりあえず、irof文は実装できたので、ヨシとしましょう。

さて、明日は@pocketberserker さんです。よろしくお願いします!

0 件のコメント:

コメントを投稿