Groovyイン・アクション読書会IN関西#1に参加してきた
ネットと書籍だけですこし勉強してたGroovyの集まりに参加してきました。
「Groovy」という言葉に「なにそれ?」「あ〜あの終わってるやつ?」みたいな反応じゃなくて、
中身のお話ができる生身の人たちと会えたことに大興奮してしまいました。
(はしゃぎすぎて迷惑かけたかもしれないけど)
Groovy,Grailsのバージョンもちゃんとあがってるし、Springも興味もってるしまだまだ
これから面白くなる可能性あると思ってます。
次回も当然参加、いつかは東京や名古屋のイベントにも参加して、もっとたくさんの人に会いないな。
ミニ言語サンプル
Pragmatic Programerのミニ言語サンプルをgroovyでやってみた。
MiniLang.groovy
public class MiniLang{ def P(val){ println "${val}のペンを選択する"} def D(){ println "ペンを紙の上に下ろす"} def W(val){ println "西方向へ${val}cm動かす"} def N(val){ println "北方向へ${val}cm動かす"} def E(val){ println "東方向へ${val}cm動かす"} def S(val){ println "南方向へ${val}cm動かす"} def U(){ println "ペンを紙から離す" } def exec(Closure cl){ cl.delegate = this cl.call() } def exec(String str){ // 簡易言語からgroovy scriptを生成 String clStr = "cl = {${str}}" clStr = clStr.replaceAll("D", "D()") // プロパティ扱いにならないよう、置換 clStr = clStr.replaceAll("U", "U()") // groovy scriptの実行 def gs = GroovyShell.newInstance() def cl = gs.evaluate(clStr) exec(cl) } }
MiniLangRunner.groovy
def minilnag = MiniLang.newInstance() scStr = """ P 2 //SyntaxSugerが働くので、このまま P(2)として動作 D //プロパティDとして認識されるので、MiniLang.exec内でD()に置換 W 2 N 1 E 2 S 1 U """ minilnag.exec(scStr)
実行結果
2のペンを選択する ペンを紙の上に下ろす 西方向へ2cm動かす 北方向へ1cm動かす 東方向へ2cm動かす 南方向へ1cm動かす ペンを紙から離す
GroovyShellクラスを使って、単なる文字列から実行結果が取得できるので、クロージャを作ってそれを実行する方法をやってみたら、うまくいった。
■
mixinとMixinアノテーションをみて試してみた。
class HelloMixin { static void hello(t){ println "hello $t" } static void magic(t,s){ println "$t is $s" } } String.mixin(HelloMixin) "World".hello() "Groovy".magic('cool') Integer.mixin(HelloMixin) // 整数にもmixinしてみる 123.hello() 123.magic('cool')
hello World Groovy is cool hello 123 123 is cool
mixinされたメソッドの最初の引数には、オブジェクト自身が渡されるみたい。
magic(t,s) って定義してるのに、使うときはmagic('cool')なんて、後で読む時に苦労しそう。