#[序] これはこれでありかもしれない!?
Android Studioでの開発はじめ、gradleを用いた開発の現場などで何かと便利使いできる、元祖AltJavaなgroovy。
他のAltJava(Scala/Kotlin)と同じく、groovyもJS環境(ブラウザ環境など)で実行できるようになっている。AltJavaな言語の中で珍しく動的言語であるgroovyは、なんとなくJavaScriptと相性がよい気がするので、試してみたい。
groovy on JS環境のgrooscript本家 :
http://grooscript.org/
小奇麗なフォントにシンタックスハイライトなトップページにちょっと好感。
どうせ、ランタイムが大きくなるんでしょ...的な疑念については、後で考えるとして、
仕事でjavaな人は、夜の愉しみにlet's groove♪
あと、web界隈からandroid/javaなこと始めたい人もjavaの世界をのぞきみるために、grooscriptいかがでしょうか?
--> groovyはjava6あたりと概ね互換なaltJavaスクリプト言語。
以下、grooscriptのブラウザ実行環境で試してます :
http://grooscript.org/conversions.html
1時間ほどだらだらと試した感想 : これはこれでありかもしれない
#1. 型なしで書きはじめますよ
まずは、Javaな人向けのgroovy入門で良くでてくるGStringを用いてみる。
a=1
b=2
println "1+2=${a+b}"
結果:
1+2=3
JSへの変換結果が少し興味深い:
a = 1;
b = 2;
gs.println("1+2=" + (gs.plus(a, b)) + "");
なるほどgsってのがよろしくやってくれるわけね。
続いて、関数定義(def)
def plus(x,y) {x+y}
println plus (3,4)
returnは省略可。
JSへの変換結果:
var plus = function(x, y) {
return gs.plus(x, y);
}
gs.println(plus(3, 4));
なるほど gsがいろいろと頑張るみたいね。
#2. クラスを書いてみよう。
groovy/grooscripでclassはこんな感じで書く:
class {
def name
def greet() { "こんにちは ${name} !!!" }
}
def hello1 = HelloWorld()
hello1.name ="grooscript"
println hello1.greet
結果:
こんにちは grooscript !!!
groovyでは変数定義も関数定義もdefだ。変数定義でdefは省略可能だけど、スコープを意識する際にはdefを書いておく必要がある。varはともかくfunctionと書かなくていいのはgoodだね^^;
さて、JSでは、classの記述は鬼門だ...
function HelloWorld() {
var gSobject = gs.inherit(gs.baseClass,'HelloWorld');
gSobject.clazz = { name: 'HelloWorld', simpleName: 'HelloWorld'};
gSobject.clazz.superclass = { name: 'java.lang.Object', simpleName: 'Object'};
gSobject.name = null;
gSobject['greet'] = function(it) {
return "こんにちは " + (gSobject.name) + " !!!";
}
if (arguments.length == 1) {gs.passMapToObject(arguments[0],gSobject);};
return gSobject;
};
var hello1 = gs.mc(this,"HelloWorld",[]);
gs.sp(hello1,"name","grooscript");
gs.println(gs.mc(hello1,"greet",[]));
...クラス周りではgsに加えて、gSobjectってのが頑張るらしいとだけ知っておけば、なんとか読めそうだ。
3. 正規表現リテラル
groovyには、正規表現リテラルというものがあり、javaよりもはるかに容易に正規表現を書くことができる。JS環境上のgrooscriptでも同様に書けるのかな!?
Groovyの正規表現について解説した、こちらのコードを概ね用いさせてもらう。
Closure reg = {String target, String pattern ->
// =~ を実行した結果、java.util.regex.Matcherのインスタンスが返される。
(target =~ pattern).each {
if( it instanceof List) { // つまりグループがある
println "Word: ${it.head()}"
println "Groups:"
it.tail().eachWithIndex {String group ,Integer i ->
println " ${i}: ${group}"
}
} else {
println it
}
}
println "*" * 30
}
// 文字列から、正規表現で該当する箇所を抜き出す方法
reg("お姉様、あぁ、おねえさま、おねえさま", /おねえさま/)
reg("さすがはお兄様ですわ。類人猿様、はじめまして、お姉様の露払い、白井黒子ですの。", /(.)(.)様/)
groovyのクロージャを用いたreg関数だ。
実行結果:
おねえさま
おねえさま
[お兄様, お, 兄]
[人猿様, 人, 猿]
[お姉様, お, 姉]
さすがなのが、お兄様なのかお姉様なのか兄貴なのか、そんなことより気になるのは、groovyクロージャのjsへの変換結果だ:
reg = function(target, pattern) {
gs.mc(gs.regExp(target,pattern),"each",[function(it) {
if (gs.instanceOf(it, "List")) {
gs.println("Word: " + (gs.mc(it,"head",[])) + "");
gs.println("Groups:");
return gs.mc(gs.mc(it,"tail",[]),"eachWithIndex",[function(group, i) {
return gs.println(" " + (i) + ": " + (group) + "");
}]);
} else {
return gs.println(it);
};
}]);
return gs.println(gs.multiply("*", 30));
};
gs.execCall(reg, this, ["お姉様、あぁ、おねえさま、おねえさま", "おねえさま"]);
gs.execCall(reg, this, ["さすがはお兄様ですわ。類人猿様、はじめまして、お姉様の露払い、白井黒子ですの。", "(.)(.)様"]);
```
むむ、悪くない。groovyの暗黙のitもけなげに置き換えてくれている。
#4.続いては...
興味が湧いてきた人は、その他、groovy界隈の方々がここ10年強ほど積み重ねてきたgroovyなweb上の記事をgrooscriptでおさらいしてみると良いだろう。テイストがあった人は、ES6ではなくgrooscriptでwebアプリ書くのもあり、..........か........も........し........れ........ない。
grooscriptは、既に、spring boot上に再構築されたというgrails3や、JS界隈で噂のreactなどに対応しているとのこと。
先人のこんなトライ記事もあります:
http://another.maple4ever.net/archives/2244/
気が向いたら、gradle使って、grooscriptで何かwebアプリを使ってみたい。