2012年7月25日水曜日

scalaの変態的ライブラリ util-eval

Scalaのライブラリに util-evalというステキなものがあります。

Twitter社が提供するライブラリです。

実際に使い方を見てみましょう。

まず、build.sbtに以下を追記。


libraryDependencies += "com.twitter" % "util-eval" % "5.2.0" withSources()
resolvers += "T repo" at "http://maven.twttr.com/"

するとこういう事ができます。


val ret = (new com.twitter.util.Eval).apply[(Int => Int)]("{(x:Int) => x*2}")

ここで定義された"ret"を、"ret(2)"のように呼び出してやれば、{(x:Int) => x*2}が実行されてInt型の4という結果が帰ってきます。


なにが起きているのかというと、util-evalは、文字列として定義されている関数をコンパイルし、それを結果として返す、というライブラリなのです。


コード中に文字列で関数を定義してもたいして意味はありませんが、たとえば、configファイルとか、DBの項目に関数を定義できるという、実に変態的なライブラリであります。


当然、こういう事をするとせっかく静的型付けな言語を使っているのにもかかわらず、実行時エラーのリスクは高まりますし、都度コンパイルされるのでパフォーマンスは目に見えて劣化します。

乱用すると幸せになれないのですが、たとえば、ゲームのアイテムマスタにアイテムの効用を実装として突っ込むとか、消費税率の計算をconfigに式として記述するとか、そういうステキなことができます。

使いどころを見極めれば非常に強力なライブラリです。

0 件のコメント:

コメントを投稿