uehaj's blog

Grな日々 - GroovyとかGrailsとかElmとかRustとかHaskellとかReactとかFregeとかJavaとか -

Groovyの日本語DSL

ついったーで評判が良かった(?)ので紹介。
日本語DSLです。Scalaのを見て書いてみました。

http://jggugcode.appspot.com/view.groovy?id=2011

Object.metaClass.getの = {delegate}
Object.metaClass.getを = {delegate}
Object.metaClass.getが = {delegate}
Object.metaClass.getする = {delegate}
Object.metaClass.getで = {delegate}
Object.metaClass.getし = {delegate}
Object.metaClass.getかつ = {delegate}
Object.metaClass.getならば = {delegate}
Object.metaClass.get平方根 = {Math.sqrt(delegate as Double)}
Object.metaClass.get表示 = {println delegate;delegate}
Object.metaClass.get二倍 = {delegate * 2}
Object.metaClass.もし = {Closure clos->delegate.grep(clos)}
Object.metaClass.のうち、 = {Closure clos->delegate.grep(clos)}
List.metaClass.それぞれに対して = {clos->delegate.each(clos)}
Object.metaClass.と = {[delegate, it]}
List.metaClass.と = {delegate+it}
Integer.metaClass.から = {new IntRange(delegate,it)}
def 倍数(x) {return {it % x == 0}}
奇数 = {it % 2 == 1}

100.の.平方根.を.表示.する

1.と(2).と(3).で.もし(奇数).ならば.それぞれに対して{それ->
  それ.の.二倍.を.表示.する
}

1.から(100).のうち、(倍数(3)).かつ.もし(倍数(2)).それぞれに対して{それ->
  println(それ+'は6の倍数です')
}

みてわかるように'.'が余分ですが、英語ベースだともっと悲惨な感じになっているでしょうかね。
ここでは「それ」を明示的にクロージャ引数としてうけてますが、前に試しに作ったようなAST変換(@Define)を使えば「暗黙のそれ」が使えるようにできると思います。

#「暗黙のそれ」ってなんか怖いな・・。