前日は、@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文のイメージを完全再現できますね。
結果、下記のような実装になります。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
case class irof (formula: Boolean)(irofBlock: => Unit) { | |
formula match { | |
case true => irofBlock | |
case _ => | |
} | |
def elof(elofBlock: => Unit): Unit = { | |
formula match { | |
case false => elofBlock | |
case _ => | |
} | |
} | |
} |
これで、我々のよく知っているif文とまったく同じイメージで、irof文が使えます。
ただ、"irof"の実態はcase classであるため、これはirof文っぽく動くのですが、Scalaのifのような「irof式」ではありません。irof文の結果を引数に取ると、irofクラスのインスタンスを受け取ってしまいます。
このあたりが、どうにかならないかなー、と悔しいところではありますが、とりあえず、irof文は実装できたので、ヨシとしましょう。
さて、明日は@pocketberserker さんです。よろしくお願いします!
0 件のコメント:
コメントを投稿