Web上で始めるgroovy再入門。

#[序]　これはこれでありかもしれない!?

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](http://d.hatena.ne.jp/r_ikeda/20090523/gstring)を用いてみる。

```gstring1.groovy
a=1
b=2

println "1+2=${a+b}"
```

結果:
> 1+2=3

JSへの変換結果が少し興味深い:

```gstring1.js
a = 1;
b = 2;
gs.println("1+2=" + (gs.plus(a, b)) + "");
```
なるほどgsってのがよろしくやってくれるわけね。

続いて、関数定義(def)

```method1.groovy
def plus(x,y) {x+y}

println plus (3,4)
```
returnは省略可。

JSへの変換結果:

```method1.js
var plus = function(x, y) {
  return gs.plus(x, y);
}
gs.println(plus(3, 4));
```

なるほど gsがいろいろと頑張るみたいね。

#2. クラスを書いてみよう。

groovy/grooscripでclassはこんな感じで書く:

```HelloWorldClass.groovy
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の記述は鬼門だ...

```HelloWorldClass.groovy
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の正規表現について解説した、[こちら](http://qiita.com/saba1024/items/61aeaf36061df35f8bee)のコードを概ね用いさせてもらう。

```reglar1.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への変換結果だ:

````reglar1.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アプリを使ってみたい。