groovy 2.1.0 20130118

17
Groovy 2.1.0が凄い 2013/1/18 JGGUG G*Workshop NTTソフトウェア Grails推進室 上原潤二 http://www.flickr.com/photos/mrhermit/3214708288/ 13118日金曜日

Upload: junji-uehara

Post on 13-Jan-2015

3.933 views

Category:

Technology


2 download

DESCRIPTION

Groovy 2.1.0 is great!

TRANSCRIPT

Page 1: groovy 2.1.0 20130118

Groovy2.1.0が凄い

2013/1/18 JGGUG G*Workshop NTTソフトウェア Grails推進室

上原潤二

http://www.flickr.com/photos/mrhermit/3214708288/13年1月18日金曜日

Page 2: groovy 2.1.0 20130118

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

自己紹介上原潤二(@uehaj)NTTソフトウェア株式会社Grails推進室JGGUG(日本Grails/Groovyユーザグループ)運営委員書籍執筆: プログラミングGROOVY(技術評論社), Grails徹底入門(翔泳社)ブログ「Grな日々」GroovyServ, LispBuilder, GVM, staticalizer開発者

13年1月18日金曜日

Page 3: groovy 2.1.0 20130118

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

Groovy 2.1.0の新機能invoke dynamic(Indy)フルサポートGPars 1.0へのアップグレード@DelegateToアノテーション拡張可能な型検査メタアノテーションシステムカスタムベーススクリプトクラスの指定コンパイラ設定スクリプトコンパイラ設定ビルダーコマンドラインからGroovyスクリプトを指定するためのURLプリフィックスjar://, file://サポート

313年1月18日金曜日

Page 4: groovy 2.1.0 20130118

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

記事かいたG*Magazine Vol.6Groovy臨機応変(第一回)動中の静…Groovy 2.1.0の新機能その1

413年1月18日金曜日

Page 5: groovy 2.1.0 20130118

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

何が凄いのか?

513年1月18日金曜日

Page 6: groovy 2.1.0 20130118

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

静的Groovyに関連する機能拡張が凄い。(個人の感想です)

613年1月18日金曜日

Page 7: groovy 2.1.0 20130118

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

Groovy 2.1.0の静的Groovyに関連する機能拡張

@DelegatesToアノテーションカスタム型チェク拡張査カスタムベーススクリプトクラスの指定コンパイラ設定スクリプトコンパイラ設定ビルダー

713年1月18日金曜日

Page 8: groovy 2.1.0 20130118

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

@DelegatesToアノテーションメソッド宣言におけるメソッド引数(クロージャ)に指定def foo(@DelegatesTo(<Class>) Closure c) { …}

8

このメソッドの引数に渡したクロージャが呼び出されるときにはdelegateプロパティに@DelegatesToに指定した型<Class>のインスタンスが代入されているということを、呼び出し側が判るように宣言する。

13年1月18日金曜日

Page 9: groovy 2.1.0 20130118

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

つまりこういうこと(1)def foo(Closure c) { …}

foo {

toUpperCase() // String#toUpperCase()が呼び出される}

913年1月18日金曜日

Page 10: groovy 2.1.0 20130118

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

つまりこういうこと(2) def foo(@DelegatesTo(String) Closure c) { … }@TypeChecked // 静的型チェックのもとでfoo { // このクロージャ内では、delegateプロパティは // Stringインスタンスを保持していると仮定できる toUpperCase()}

10

静的型チェックもしくは静的コンパイルできる。(DelegatesToが無ければ静的型チェックエラー)

13年1月18日金曜日

Page 11: groovy 2.1.0 20130118

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

つまりこういうこと(3)def foo(@DelegatesTo(String) Closure c) { …}@TypeCheckedfoo { // delegateはStringインスタンスを保持 // していると仮定できる toooUpperCase()}

11

コンパイル時エラーになる

13年1月18日金曜日

Page 12: groovy 2.1.0 20130118

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

何ができるのか?

1213年1月18日金曜日

Page 13: groovy 2.1.0 20130118

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

何ができるのか?delegateを用いて実装されたビルダーやDSLの静的型チェックが簡単にできる。「カスタム型チェック拡張」よりも簡単だが制約は比較的大きい。IDEが対応すれば補完もドキュメントとしても役立つ

1313年1月18日金曜日

Page 14: groovy 2.1.0 20130118

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

やってみた(1)静的型チェック可能なMarkupBuilderモドキ

14

@TypeCheckeddef  test()  {    new  HtmlBuilder().html  {        head  {            title  "Groovy  2.0.1は凄い!"        }        body  {            p  "Groovy  2.0.1は凄い!"            ul  {                li  "リスト1"                ul  "リスト2"            }            h1  "凄いわ!"        }    }}

コンパイル時エラーになる→flymake-groovyでデモ

https://gist.github.com/456320113年1月18日金曜日

Page 15: groovy 2.1.0 20130118

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

やってみた(2)

15

import  groovy.transform.*class  HtmlBuilder  {    def  html(@DelegatesTo(Html)  Closure  c)  {        c.delegate  =  new  Html()        println  "<html>";  c();  println  "</html>"    }}class  Html  {    def  head(@DelegatesTo(Head)  Closure  c)  {        c.delegate  =  new  Head()        println  "  <head>";  c();  println  "  </head>"    }    def  body(@DelegatesTo(Body)  Closure  c)  {        c.delegate  =  new  Body()        println  "  <body>";  c();  println  "  </body>"    }}class  Head  {    def  title(String  s)  {  println  "    <title>$s</title>"  }}class  Body  {    def  h1(String  s)  {  println  "    <h1>$s</h1>"  }    def  p(String  s)  {  println  "    <p>$s</p>"  }    def  ul(@DelegatesTo(Ul)  Closure  c)  {        c.delegate  =  new  Ul()        println  "    <ul>";  c();  println  "    </ul>"    }}class  Ul  {    def  li(String  s){  println  "      <li>$s</li>"  }}

13年1月18日金曜日

Page 16: groovy 2.1.0 20130118

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

カスタム型チェック拡張でたぶんできそうなこと

16

Grailsのdynamic finderを、DBスキーマをコンパイル時に参照することで静的型チェックコンパイル時にメソッドが存在しない場合、GroovyのモジュールをGrapeでダウンロードしてメソッドを追加するメソッドが存在しない場合、invokeMethod呼び出しにする(Groovy++のmixedモードコンパイル相当)sprintf()のフォーマットと引数型のチェック任意のチェッカ(コーディング規約チェックとか)AST変換が道を開いたGroovyコンパイラのオープン化の一環

13年1月18日金曜日

Page 17: groovy 2.1.0 20130118

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

まとめ

17

Groovy 2.1.0の静的Groovyに関連する機能拡張が凄い。(詳しくはG*Magで)

13年1月18日金曜日