14
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Web上で始めるgroovy再入門。

Last updated at Posted at 2016-06-10

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

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を用いてみる。

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の正規表現について解説した、こちらのコードを概ね用いさせてもらう。

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アプリを使ってみたい。
14
16
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?