SlideShare a Scribd company logo
Groovy
              2.1.0が凄い
       2013/1/18 JGGUG G*Workshop
            NTTソフトウェア Grails推進室
                           上原潤二


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



        Slide #   JGGUG G*Workshop   Copyright(C) 2012 NTT Software Corporation All rights reserved.
13年1月18日金曜日
Groovy 2.1.0の新機能
      invoke dynamic(Indy)フルサポート
      GPars 1.0へのアップグレード
      @DelegateToアノテーション
      拡張可能な型検査
      メタアノテーションシステム
      カスタムベーススクリプトクラスの指定
      コンパイラ設定スクリプト
      コンパイラ設定ビルダー
      コマンドラインからGroovyスクリプトを指定するため
      のURLプリフィックスjar://, file://サポート
        Slide # 3   JGGUG G*Workshop   Copyright(C) 2012 NTT Software Corporation All rights reserved.
13年1月18日金曜日
記事かいた
      G*Magazine Vol.6
      Groovy臨機応変(第一回)
      動中の静…Groovy 2.1.0の新
      機能その1



        Slide # 4   JGGUG G*Workshop   Copyright(C) 2012 NTT Software Corporation All rights reserved.
13年1月18日金曜日
何が凄いのか?

        Slide # 5   JGGUG G*Workshop   Copyright(C) 2012 NTT Software Corporation All rights reserved.
13年1月18日金曜日
静的Groovyに
     関連する機能拡
     張が凄い。(個人の感
     想です)
        Slide # 6   JGGUG G*Workshop   Copyright(C) 2012 NTT Software Corporation All rights reserved.
13年1月18日金曜日
Groovy 2.1.0の静的Groovyに関連する機能拡張

              @DelegatesToアノテーション
              カスタム型チェク拡張査
              カスタムベーススクリプトクラ
         スの指定
              コンパイラ設定スクリプト
              コンパイラ設定ビルダー
        Slide # 7   JGGUG G*Workshop   Copyright(C) 2012 NTT Software Corporation All rights reserved.
13年1月18日金曜日
@DelegatesToアノテーション
      メソッド宣言におけるメソッド引数(クロージ
      ャ)に指定
      def foo(@DelegatesTo(<Class>) Closure c) {
        …
      }
      このメソッドの引数に渡したクロージャが呼
      び出されるときにはdelegateプロパティに
      @DelegatesToに指定した型<Class>のイン
      スタンスが代入されているということを、呼び
      出し側が判るように宣言する。
        Slide # 8   JGGUG G*Workshop   Copyright(C) 2012 NTT Software Corporation All rights reserved.
13年1月18日金曜日
つまりこういうこと(1)
   def foo(Closure c) {
     …
   }


   foo {




    toUpperCase() // String#toUpperCase()が呼び出
   される
   }
        Slide # 9   JGGUG G*Workshop   Copyright(C) 2012 NTT Software Corporation All rights reserved.
13年1月18日金曜日
つまりこういうこと(2)
   def foo(@DelegatesTo(String) Closure c) {
     …
   }
   @TypeChecked // 静的型チェックのもとで
   foo {
       // このクロージャ内では、delegateプロパティは
       // Stringインスタンスを保持していると仮定できる
       toUpperCase()                                   静的型チェックもしくは静的
                                                      コンパイルできる。
   }                                                  (DelegatesToが無ければ静
                                                      的型チェックエラー)

        Slide # 10 JGGUG G*Workshop   Copyright(C) 2012 NTT Software Corporation All rights reserved.
13年1月18日金曜日
つまりこういうこと(3)
   def foo(@DelegatesTo(String) Closure c) {
     …
   }
   @TypeChecked
   foo {
       // delegateはStringインスタンスを保持
       // していると仮定できる
       toooUpperCase()
   }                                                   コンパイル時エラーになる



        Slide # 11 JGGUG G*Workshop   Copyright(C) 2012 NTT Software Corporation All rights reserved.
13年1月18日金曜日
何ができるのか?

        Slide # 12 JGGUG G*Workshop   Copyright(C) 2012 NTT Software Corporation All rights reserved.
13年1月18日金曜日
何ができるのか?
      delegateを用いて実装されたビ
      ルダーやDSLの静的型チェック
      が簡単にできる。
         「カスタム型チェック拡張」よりも簡単だが
         制約は比較的大きい。
      IDEが対応すれば補完も
      ドキュメントとしても役立つ

        Slide # 13 JGGUG G*Workshop   Copyright(C) 2012 NTT Software Corporation All rights reserved.
13年1月18日金曜日
やってみた(1)
      静的型チェック可能なMarkupBuilderモドキ
          @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/4563201
        Slide # 14 JGGUG G*Workshop   Copyright(C) 2012 NTT Software Corporation All rights reserved.
13年1月18日金曜日
やってみた(2)
     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>"	
  }
     }

        Slide # 15 JGGUG G*Workshop                  Copyright(C) 2012 NTT Software Corporation All rights reserved.
13年1月18日金曜日
カスタム型チェック拡張でたぶんできそうなこと

     Grailsのdynamic finderを、DBスキーマをコンパイ
     ル時に参照することで静的型チェック
     コンパイル時にメソッドが存在しない場合、Groovy
     のモジュールをGrapeでダウンロードしてメソッド
     を追加する
     メソッドが存在しない場合、invokeMethod呼び出
     しにする(Groovy++のmixedモードコンパイル相当)
     sprintf()のフォーマットと引数型のチェック
     任意のチェッカ(コーディング規約チェックとか)
     AST変換が道を開いたGroovyコンパイラのオープン
     化の一環
        Slide # 16 JGGUG G*Workshop   Copyright(C) 2012 NTT Software Corporation All rights reserved.
13年1月18日金曜日
まとめ

     Groovy 2.1.0の
     静的Groovyに関
     連する機能拡張が
     凄い。(詳しくはG*Magで)
        Slide # 17 JGGUG G*Workshop   Copyright(C) 2012 NTT Software Corporation All rights reserved.
13年1月18日金曜日

More Related Content

groovy 2.1.0 20130118

  • 1. Groovy 2.1.0が凄い 2013/1/18 JGGUG G*Workshop NTTソフトウェア Grails推進室 上原潤二 http://www.flickr.com/photos/mrhermit/3214708288/ 13年1月18日金曜日
  • 2. 自己紹介 上原潤二(@uehaj) NTTソフトウェア株式会社Grails推進室 JGGUG(日本Grails/Groovyユーザグループ) 運営委員 書籍執筆: プログラミングGROOVY(技術評 論社), Grails徹底入門(翔泳社) ブログ「Grな日々」 GroovyServ, LispBuilder, GVM, staticalizer開発者 Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved. 13年1月18日金曜日
  • 3. Groovy 2.1.0の新機能 invoke dynamic(Indy)フルサポート GPars 1.0へのアップグレード @DelegateToアノテーション 拡張可能な型検査 メタアノテーションシステム カスタムベーススクリプトクラスの指定 コンパイラ設定スクリプト コンパイラ設定ビルダー コマンドラインからGroovyスクリプトを指定するため のURLプリフィックスjar://, file://サポート Slide # 3 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved. 13年1月18日金曜日
  • 4. 記事かいた G*Magazine Vol.6 Groovy臨機応変(第一回) 動中の静…Groovy 2.1.0の新 機能その1 Slide # 4 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved. 13年1月18日金曜日
  • 5. 何が凄いのか? Slide # 5 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved. 13年1月18日金曜日
  • 6. 静的Groovyに 関連する機能拡 張が凄い。(個人の感 想です) Slide # 6 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved. 13年1月18日金曜日
  • 7. Groovy 2.1.0の静的Groovyに関連する機能拡張 @DelegatesToアノテーション カスタム型チェク拡張査 カスタムベーススクリプトクラ スの指定 コンパイラ設定スクリプト コンパイラ設定ビルダー Slide # 7 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved. 13年1月18日金曜日
  • 8. @DelegatesToアノテーション メソッド宣言におけるメソッド引数(クロージ ャ)に指定 def foo(@DelegatesTo(<Class>) Closure c) { … } このメソッドの引数に渡したクロージャが呼 び出されるときにはdelegateプロパティに @DelegatesToに指定した型<Class>のイン スタンスが代入されているということを、呼び 出し側が判るように宣言する。 Slide # 8 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved. 13年1月18日金曜日
  • 9. つまりこういうこと(1) def foo(Closure c) { … } foo { toUpperCase() // String#toUpperCase()が呼び出 される } Slide # 9 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved. 13年1月18日金曜日
  • 10. つまりこういうこと(2) def foo(@DelegatesTo(String) Closure c) { … } @TypeChecked // 静的型チェックのもとで foo { // このクロージャ内では、delegateプロパティは // Stringインスタンスを保持していると仮定できる toUpperCase() 静的型チェックもしくは静的 コンパイルできる。 } (DelegatesToが無ければ静 的型チェックエラー) Slide # 10 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved. 13年1月18日金曜日
  • 11. つまりこういうこと(3) def foo(@DelegatesTo(String) Closure c) { … } @TypeChecked foo { // delegateはStringインスタンスを保持 // していると仮定できる toooUpperCase() } コンパイル時エラーになる Slide # 11 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved. 13年1月18日金曜日
  • 12. 何ができるのか? Slide # 12 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved. 13年1月18日金曜日
  • 13. 何ができるのか? delegateを用いて実装されたビ ルダーやDSLの静的型チェック が簡単にできる。 「カスタム型チェック拡張」よりも簡単だが 制約は比較的大きい。 IDEが対応すれば補完も ドキュメントとしても役立つ Slide # 13 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved. 13年1月18日金曜日
  • 14. やってみた(1) 静的型チェック可能なMarkupBuilderモドキ @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/4563201 Slide # 14 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved. 13年1月18日金曜日
  • 15. やってみた(2) 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>"  } } Slide # 15 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved. 13年1月18日金曜日
  • 16. カスタム型チェック拡張でたぶんできそうなこと Grailsのdynamic finderを、DBスキーマをコンパイ ル時に参照することで静的型チェック コンパイル時にメソッドが存在しない場合、Groovy のモジュールをGrapeでダウンロードしてメソッド を追加する メソッドが存在しない場合、invokeMethod呼び出 しにする(Groovy++のmixedモードコンパイル相当) sprintf()のフォーマットと引数型のチェック 任意のチェッカ(コーディング規約チェックとか) AST変換が道を開いたGroovyコンパイラのオープン 化の一環 Slide # 16 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved. 13年1月18日金曜日
  • 17. まとめ Groovy 2.1.0の 静的Groovyに関 連する機能拡張が 凄い。(詳しくはG*Magで) Slide # 17 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved. 13年1月18日金曜日