new feature of groovy2.0 g*workshop
DESCRIPTION
JGGUG G*ワークショップ「Vert.x+JavaOne+Groovy2.0なG*」での発表資料です。TRANSCRIPT
Groovy2.0の新機能
疾きことCompileStaticのごとし
2012/10/26 JGGUG G*Workshop #24 NTTソフトウェア Grails推進室 上原潤二
http://www.flickr.com/photos/mrhermit/3214708288/12年10月27日土曜日
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開発者
12年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
お品書きGroovyの歴史を簡単にGroovy1.8の新機能(おさらい)Groovy2.0の新機能静的Groovyindy対応ライブラリ強化モジュール化
まとめGroovy 3.X
312年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
Groovyの歴史を簡単に
4
年 リリース トピックス2003 Groovy 開発開始2004 Groovy 1.0-jsr-01 JSR 2412007 Groovy 1.02007 Groovy 1.5(=1.1) Java5対応2009 Groovy 1.6 AST変換導入2009 Groovy 1.72011 Groovy 1.82012 Groovy 2.0(=1.9) Java SE 7対応
12年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
AST変換強化
ライブラリ強化
Java SE 7対応
静的Grovy
Groovy 2.0の新機能 その他
512年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
AST変換強化
ライブラリ強化
Java SE 7対応
静的Grovy
Groovy 2.0の新機能 その他
静的型チェック静的コンパイル
512年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
AST変換強化
ライブラリ強化
Java SE 7対応
静的Grovy
Groovy 2.0の新機能 その他
NotYetImplemented
TypeChecked, CompileStatic
静的型チェック静的コンパイル
512年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
AST変換強化
ライブラリ強化
Java SE 7対応
静的Grovy
Groovy 2.0の新機能 その他
NotYetImplemented
TypeChecked, CompileStatic
モジュール化
静的型チェック静的コンパイル
512年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
AST変換強化
ライブラリ強化
Java SE 7対応
静的Grovy
Groovy 2.0の新機能 その他
NotYetImplemented
TypeChecked, CompileStatic
モジュール化
静的型チェック静的コンパイル
5
Project Coin対応
indy対応
二進リテラル
マルチキャッチ
リテラル中の下線
12年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
AST変換強化
ライブラリ強化
Java SE 7対応
静的Grovy
Groovy 2.0の新機能 その他
NotYetImplemented
TypeChecked, CompileStatic
モジュール化
静的型チェック静的コンパイル
5
Project Coin対応
indy対応
二進リテラル
マルチキャッチ
リテラル中の下線Collection.inject()
Matcher.matchesPartially()
takeWhile/dropWhileCalendar.next/PreviouswithDefault/withEagar…
12年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
AST変換強化
ライブラリ強化
Java SE 7対応
静的Grovy
Groovy 2.0の新機能 その他
NotYetImplemented
TypeChecked, CompileStatic
モジュール化
静的型チェック静的コンパイル
5
Project Coin対応
indy対応
二進リテラル
マルチキャッチ
リテラル中の下線Collection.inject()
Matcher.matchesPartially()
takeWhile/dropWhileCalendar.next/PreviouswithDefault/withEagar…
12年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
AST変換群SinceGroovy 2.0NotYetImplementedTypeCheckedCompileStatic
6
Since Groovy 1.7 Grabpower assert
SinceGroovy 1.8ListenerList AutoCloneAutoExternalizeCanonicalEqualsAndHashCodeFieldIndexedPropertyInheritConstructorsSynchronizedConditionalInterrupt ThreadInterruptTimedInterruptToStringTupleConstructorWithReadLock / WithWriteLockCommons / Log / Log4j / Slf4j
Since Groovy 1.6
BindableVetoableCategoryDelegateImmutableLazyMixinNewifySingletonPackageScope
2.0新機能
12年10月27日土曜日
静的Groovyhttp://www.flickr.com/photos/kaeru/501750/
12年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
静的型チェック/静的コンパイル@TypeChecked: 静的型チェック➡型を確定することでわかるエラーをコンパイル時にチェック
@CompileStatic: 静的コンパイル➡静的型チェックに加え、型が静的に定まっていることを前提としたコードが生成➡目的は性能向上AST変換アノテーションとして実装されている
これらのアノテーションをクラスやメソッドに指定すると、その範囲のメソッド内のコードが対象となる
8
2.0新機能
この2者を総称したものがGroovy2.0での「静的Groovy」
12年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
「静的Groovy」で何がどう変わるの?
変数・メソッド引数等に型宣言が必要となる(その結果キャスト等が必要になる場合がある)要はjavaといっしょだyo!!!ただし型推論により型宣言は省略できる場合がある
型推論対象:クロージャから参照されていないローカル変数やメソッド引数
型推論対象外(明示的型指定が必要):フィールドやバインディング変数クロージャ引数(itなど) クロージャから参照されているローカル変数やメソッド引数
9
変数への代入/初期化の右辺等により型を決める
他スレッドによる変数の値変更をコンパイラが把握できないため12年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
静的型チェックにより検出されるエラー例
10
import groovy.transform.TypeChecked
@TypeCheckedint foo(String s) { int i = s // [Static type checking] -‐ Cannot assign value of type java.lang.String to variable of type int String result = s.toUppperCase() // [Static type checking] -‐ Cannot find matching method java.lang.String#toUppperCase(). Please check if the declared type is right and if the method exists. return result // [Static type checking] -‐ Cannot return value of type java.lang.String on method returning type int}
型が違う!
そんなメソッド無い!
型が違う!
12年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
GGTS 3.0.0から利用
1112年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
フローセンシティブタイピング
12
def a = -3
a.abs()a.toUpperCase()
a = "ABC"
a.abs()a.toUpperCase()
12年10月27日土曜日
aはint型と見なされる
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
フローセンシティブタイピング
12
def a = -3
a.abs()a.toUpperCase()
a = "ABC"
a.abs()a.toUpperCase()
12年10月27日土曜日
aはString型と見なされる
aはint型と見なされる
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
フローセンシティブタイピング
12
def a = -3
a.abs()a.toUpperCase()
a = "ABC"
a.abs()a.toUpperCase()
12年10月27日土曜日
aはString型と見なされる
aはint型と見なされる
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
フローセンシティブタイピング
12
def a = -3
a.abs()a.toUpperCase()
a = "ABC"
a.abs()a.toUpperCase()
[Static type checking] - Cannot find matching method java.lang.Integer#toUpperCase()
12年10月27日土曜日
aはString型と見なされる
aはint型と見なされる
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
フローセンシティブタイピング
12
def a = -3
a.abs()a.toUpperCase()
a = "ABC"
a.abs()a.toUpperCase()
[Static type checking] - Cannot find matching method java.lang.Integer#toUpperCase()
[Static type checking] - Cannot find matching method java.lang.String#abs()
12年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
静的コンパイル String foo(String s) { s.toUpperCase() }
@CompileStatic String bar(String s) { s.toUpperCase() }
12年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
静的コンパイル String foo(String s) { s.toUpperCase() }
@CompileStatic String bar(String s) { s.toUpperCase() }
public String foo(String s){ CallSite acallsite[] = $getCallSiteArray(); return (String)ScriptBytecodeAdapter.castToType(acallsite[0].call(s), java/lang/String);}
12年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
静的コンパイル String foo(String s) { s.toUpperCase() }
@CompileStatic String bar(String s) { s.toUpperCase() }
public String foo(String s){ CallSite acallsite[] = $getCallSiteArray(); return (String)ScriptBytecodeAdapter.castToType(acallsite[0].call(s), java/lang/String);}
public String bar(String s){ return s.toUpperCase();}
12年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
ベンチマーク(CompileStatic)
14
https://github.com/alextkachman/fib-benchmark をベースに計測。グラフはJavaを1としたときの実行時間の比率(大きいほど速い)。
0.0##
0.2##
0.4##
0.6##
0.8##
1.0##
1.2##
[Binary#Trees]#
[Fannkuch]#
[Fasta]#
[Fib(sta<c#ternary)]#
[Fib(sta<c#if)]#
[Fib(instance#ternary)]#
[Fib(instance#if)]#
[Quicksort]#
[SpectralNorm]#
[ThreadRing]#
Groovy#1.8.2#
Groovy#2.0.1#
Groovy#2.0.1#CompileSta<c#
Java#SE#1.7.0u6#
CompileStatic
12年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
静的型のメリット・デメリット静的型のメリット:1.静的型情報に基づいた最適化による性能向上➡静的コンパイル
2.コンパイル時型チェックによる信頼性向上➡静的型チェック
3.作業効率向上(IDEによる入力補完機能、タイプミス早期検出)➡静的型チェック
4.ドキュメンテーションとしての型情報による保守性向上➡オプショナルタイピング(既存機能)
デメリット: 面倒臭い・字数が増える・多態コード・動的機能(EMC,Builderやマルチメソッドなど)が利用できない
15
総合的にいって、本当に向上するかは議論の余地がある
12年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
@CompileStatic適用の実際既存のGroovyコードを静的コンパイルするために必要なのは、@CompileStaticをつけて回るだけの簡単な作業・・・
静的コンパイルを通すための修正(例):型宣言を省略していたところを補う(def, 引数, it
を型指定して宣言)/Closure#call()の返り値はキャストする/nullを適宜キャストする/引数の動的型に基いたメソッド選択(マルチメソッド)を使用していた場合、静的に型が確定しているならキャストで。していなければ、Java的にダブルディスパッチで実装しなおす/ダックタイピングは複数メソッドに展開するかinterfaceを導入
➡規模が大きいと書き換えは相当面倒以下は対応不可EMC、カテゴリ、invokeMethod()などによる動的メソッド追加(結果としてのBuilder周り)メソッド引数でのSpread/Spread map operator (*)の使用アクセス修飾(private,protected,package private)が効いてアクセス不可
➡@CompileStatic(TypeCheckingMode.SKIP)で逃げる16
ではない!(少なくともGroovy 2.0.0では。)
12年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
CompileStaticとアクセス修飾静的コンパイルで生成されるコードはJavaのアクセス修飾子による制限に支配される他クラスのprivateメソッドは呼べない(Javaでは当たり前)ただし、Groovyで定義した(GroovyObjectを継承した)クラスに対して、フィールドに関してはブリッジメソッド経由でアクセス可
17
class Target { private int field private void method(){}}
@groovy.transform.CompileStaticclass StaticCompiledClass { void foo(Target t) { t.method() // Cannot call private method Target#method "ABC".value[0] = "x" // [STC] -‐ Access to java.lang.String#value is forbidden t.field = 3 // OK }}
ちなみに@TypeCheckedではエラーにならないのが仕様らしいが(GROOVY-5677)
12年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
余談:Grails 2.2での状況Grails 2.2ではGroovy 2.Xが採用される予定Grailsの最新ソースを「CompileStatic」でgrepしてみる
18
% grep -‐r CompileStatic ../grails-‐bootstrap/src/main/groovy/grails/util/BuildSettings.groovy:import groovy.transform.CompileStatic./grails-‐bootstrap/src/main/groovy/grails/util/BuildSettings.groovy: @CompileStatic./grails-‐bootstrap/src/main/groovy/grails/util/BuildSettings.groovy: @CompileStatic./grails-‐bootstrap/src/main/groovy/grails/util/BuildSettings.groovy: @CompileStatic./grails-‐bootstrap/src/main/groovy/grails/util/BuildSettings.groovy: @CompileStatic./grails-‐bootstrap/src/main/groovy/grails/util/BuildSettings.groovy: @CompileStatic :% grep -‐r CompileStatic . | wc 124 247 13863
12年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
Groovy++と静的Groovy
19
Groovy++2009~2011(開発完)
@TypeChecked静的型チェック
@CompileStatic静的コンパイル
2011~
コードベースの継続性はない
Groovy 2.0
@Typedアノテーションによる静的Groovy
mixedモードコンパイル、末尾再帰最適化、traits..などの先進的な機能 対応物は今のところ
無し
12年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
ベンチマーク(vs. Groovy++)
20
0.0##
0.2##
0.4##
0.6##
0.8##
1.0##
1.2##
[Binary#Trees]#
[Fannkuch]#
[Fasta]#
[Fib(sta<c#ternary)]#
[Fib(sta<c#if)]#
[Fib(instance#ternary)]#
[Fib(instance#if)]#
[Quicksort]#
[SpectralNorm]#
[ThreadRing]#
Groovy#1.8.2#
Groovy#2.0.1#
Groovy#2.0.1#CompileSta<c#
Java#SE#1.7.0u6#
Groovy#2.0.1#indy#
Groovy++0.9.0/1.8.2#
Grroovy++
12年10月27日土曜日
indy対応http://www.flickr.com/photos/tdar/6330565982/
12年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
indyとその利用方法
groovy/groovycコマンドから使う<GROOVY_HOME>/lib,embeddeable/配下の、-indy接尾辞のついたjarファイルを-indyなしにリネームgroovyコマンド、もしくはgroovycコマンドで--indyを指定
gradle(1.1以降)から使う
22
dependencies { groovy group: 'org.codehaus.groovy', name: 'groovy-‐all', version:'2.0.1', classifier:'indy'}compileGroovy { groovyOptions.optimizationOptions.indy=true}
indy…Java VM上での動的言語実行の効率化を目的とした機能拡張(JSR292)の通称。Java SE 7(JDK)から利用可
2.0新機能
12年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
ベンチマーク(indy)
23
0.0##
0.2##
0.4##
0.6##
0.8##
1.0##
1.2##
[Binary#Trees]#
[Fannkuch]#
[Fasta]#
[Fib(sta<c#ternary)]#
[Fib(sta<c#if)]#
[Fib(instance#ternary)]#
[Fib(instance#if)]#
[Quicksort]#
[SpectralNorm]#
[ThreadRing]#
Groovy#1.8.2#
Groovy#2.0.1#
Groovy#2.0.1#CompileSta<c#
Java#SE#1.7.0u6#
Groovy#2.0.1#indy#
Groovy 2.0.1 -indy
12年10月27日土曜日
ライブラリ強化
http://www.flickr.com/photos/aloudnoise/5133172272/12年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
injectのおさらい
25
[e1,e2,e3,e4,e5].inject(ini){acc,val-‐>式} → <結果>
assert [1,2,3,4,5].inject(0){a,b -‐> a+b} == 1512年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
injectのおさらい
25
[e1,e2,e3,e4,e5].inject(ini){acc,val-‐>式} → <結果>
ini e1, e2, e3, e4, e5 ][
assert [1,2,3,4,5].inject(0){a,b -‐> a+b} == 1512年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
injectのおさらい
25
{acc,val-‐>式}
[e1,e2,e3,e4,e5].inject(ini){acc,val-‐>式} → <結果>
ini e1, e2, e3, e4, e5 ][
assert [1,2,3,4,5].inject(0){a,b -‐> a+b} == 1512年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
injectのおさらい
25
{acc,val-‐>式}
{acc,val-‐>式}
[e1,e2,e3,e4,e5].inject(ini){acc,val-‐>式} → <結果>
ini e1, e2, e3, e4, e5 ][
assert [1,2,3,4,5].inject(0){a,b -‐> a+b} == 1512年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
injectのおさらい
25
{acc,val-‐>式}
{acc,val-‐>式}
{acc,val-‐>式}
[e1,e2,e3,e4,e5].inject(ini){acc,val-‐>式} → <結果>
ini e1, e2, e3, e4, e5 ][
assert [1,2,3,4,5].inject(0){a,b -‐> a+b} == 1512年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
injectのおさらい
25
{acc,val-‐>式}
{acc,val-‐>式}
{acc,val-‐>式}
{acc,val-‐>式}
[e1,e2,e3,e4,e5].inject(ini){acc,val-‐>式} → <結果>
ini e1, e2, e3, e4, e5 ][
assert [1,2,3,4,5].inject(0){a,b -‐> a+b} == 1512年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
injectのおさらい
25
{acc,val-‐>式}
{acc,val-‐>式}
{acc,val-‐>式}
{acc,val-‐>式}
{acc,val-‐>式}
[e1,e2,e3,e4,e5].inject(ini){acc,val-‐>式} → <結果>
ini e1, e2, e3, e4, e5 ][
assert [1,2,3,4,5].inject(0){a,b -‐> a+b} == 1512年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
injectのおさらい
25
{acc,val-‐>式}
{acc,val-‐>式}
{acc,val-‐>式}
{acc,val-‐>式}
{acc,val-‐>式} → <結果>
[e1,e2,e3,e4,e5].inject(ini){acc,val-‐>式} → <結果>
ini e1, e2, e3, e4, e5 ][
assert [1,2,3,4,5].inject(0){a,b -‐> a+b} == 1512年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
初期値無しinject
26
e1
{acc,val-‐>式}
{acc,val-‐>式}
{acc,val-‐>式}
{acc,val-‐>式} → <結果>
[e1,e2,e3,e4,e5].inject{acc,val-‐>式} → <結果>
e2, e3, e4, e5 ][
2.0新機能
assert [1,2,3,4,5].inject{a,b -‐> a+b} == 1512年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
Matcher#matchesPartially()
27
(x=~p).matchesPartially()の結果
➡インタラクティブなバリデーションなどに使用可能
assert ("1" =~ /\d\d\d/).matchesPartially()assert ("12" =~ /\d\d\d/).matchesPartially()assert ("123" =~ /\d\d\d/).matchesPartially()assert !("12a" =~ /\d\d\d/).matchesPartially()assert !("1234" =~ /\d\d\d/).matchesPartially()
true …文字列xの末尾になんらかの文字列を追加したものは、 パターンpにマッチする可能性がある
false …文字列xの末尾にどんな文字列を追加しても、 パターンpにマッチすることは有り得ない
2.0新機能
12年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
(List,CharSequence,Map,T[]).takeWhile{}
28
[e1,e2,e3,e4,e5].takeWhile{it-‐>式} → <結果>
リストの要素を順にたどり、クロージャを適用した結果が真である要素のみからなる先頭部分を返す。
assert [1,2,3,4,3].takeWhile{it<=3} == [1,2,3]
[ ]
][
2.0新機能
12年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
(List,CharSequence,Map,T[]).takeWhile{}
28
[e1,e2,e3,e4,e5].takeWhile{it-‐>式} → <結果>
リストの要素を順にたどり、クロージャを適用した結果が真である要素のみからなる先頭部分を返す。
assert [1,2,3,4,3].takeWhile{it<=3} == [1,2,3]
[ ]
][
e1,
e1,
{it-‐>式}がtrue
2.0新機能
12年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
(List,CharSequence,Map,T[]).takeWhile{}
28
[e1,e2,e3,e4,e5].takeWhile{it-‐>式} → <結果>
リストの要素を順にたどり、クロージャを適用した結果が真である要素のみからなる先頭部分を返す。
assert [1,2,3,4,3].takeWhile{it<=3} == [1,2,3]
[ ]
][
e1,
e1,
{it-‐>式}がtrue
e2,
e2,
{it-‐>式}がtrue
2.0新機能
12年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
(List,CharSequence,Map,T[]).takeWhile{}
28
[e1,e2,e3,e4,e5].takeWhile{it-‐>式} → <結果>
リストの要素を順にたどり、クロージャを適用した結果が真である要素のみからなる先頭部分を返す。
assert [1,2,3,4,3].takeWhile{it<=3} == [1,2,3]
[ ]
][
e1,
e1,
{it-‐>式}がtrue
e2,
e2,
{it-‐>式}がtrue
e3,
{it-‐>式}がtrue
e3
2.0新機能
12年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
(List,CharSequence,Map,T[]).takeWhile{}
28
[e1,e2,e3,e4,e5].takeWhile{it-‐>式} → <結果>
リストの要素を順にたどり、クロージャを適用した結果が真である要素のみからなる先頭部分を返す。
assert [1,2,3,4,3].takeWhile{it<=3} == [1,2,3]
[ ]
][
e1,
e1,
{it-‐>式}がtrue
e2,
e2,
{it-‐>式}がtrue
e4,
{it-‐>式}がfalse
e3,
{it-‐>式}がtrue
e3
2.0新機能
12年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
(List,CharSequence,Map,T[]).takeWhile{}
28
[e1,e2,e3,e4,e5].takeWhile{it-‐>式} → <結果>
リストの要素を順にたどり、クロージャを適用した結果が真である要素のみからなる先頭部分を返す。
assert [1,2,3,4,3].takeWhile{it<=3} == [1,2,3]
e5
{it-‐>式}がtrue
[ ]
][
e1,
e1,
{it-‐>式}がtrue
e2,
e2,
{it-‐>式}がtrue
e4,
{it-‐>式}がfalse
e3,
{it-‐>式}がtrue
e3
2.0新機能
12年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
(List,CharSequence,Map,T[]).dropWhile{}
29
[e1,e2,e3,e4,e5].dropWhile{it-‐>式} → <結果>
リストの要素を順にたどり、クロージャを適用した結果が偽である初めての要素以降を返す。
assert [1,2,3,4,3].dropWhile{it<=3} == [4,5]
[ ]
][
2.0新機能
12年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
(List,CharSequence,Map,T[]).dropWhile{}
29
[e1,e2,e3,e4,e5].dropWhile{it-‐>式} → <結果>
リストの要素を順にたどり、クロージャを適用した結果が偽である初めての要素以降を返す。
assert [1,2,3,4,3].dropWhile{it<=3} == [4,5]
[ ]
][
e1,
{it-‐>式}がtrue
2.0新機能
12年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
(List,CharSequence,Map,T[]).dropWhile{}
29
[e1,e2,e3,e4,e5].dropWhile{it-‐>式} → <結果>
リストの要素を順にたどり、クロージャを適用した結果が偽である初めての要素以降を返す。
assert [1,2,3,4,3].dropWhile{it<=3} == [4,5]
[ ]
][
e1,
{it-‐>式}がtrue
e2,
{it-‐>式}がtrue
2.0新機能
12年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
(List,CharSequence,Map,T[]).dropWhile{}
29
[e1,e2,e3,e4,e5].dropWhile{it-‐>式} → <結果>
リストの要素を順にたどり、クロージャを適用した結果が偽である初めての要素以降を返す。
assert [1,2,3,4,3].dropWhile{it<=3} == [4,5]
[ ]
][
e1,
{it-‐>式}がtrue
e2,
{it-‐>式}がtrue
e3,
{it-‐>式}がtrue
2.0新機能
12年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
(List,CharSequence,Map,T[]).dropWhile{}
29
[e1,e2,e3,e4,e5].dropWhile{it-‐>式} → <結果>
リストの要素を順にたどり、クロージャを適用した結果が偽である初めての要素以降を返す。
assert [1,2,3,4,3].dropWhile{it<=3} == [4,5]
[ ]
][
e1,
{it-‐>式}がtrue
e2,
{it-‐>式}がtrue
e3,
{it-‐>式}がtrue
e4,
{it-‐>式}がfalse
e4,
2.0新機能
12年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
(List,CharSequence,Map,T[]).dropWhile{}
29
[e1,e2,e3,e4,e5].dropWhile{it-‐>式} → <結果>
リストの要素を順にたどり、クロージャを適用した結果が偽である初めての要素以降を返す。
assert [1,2,3,4,3].dropWhile{it<=3} == [4,5]
[ ]
][
e1,
{it-‐>式}がtrue
e2,
{it-‐>式}がtrue
e3,
{it-‐>式}がtrue
e4,
{it-‐>式}がfalse
e4,
e5
{it-‐>式}がtrue
e5
2.0新機能
12年10月27日土曜日
モジュール化http://www.flickr.com/photos/aplumb/3890003295/
12年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
モジュール化(1)
groovy-1.8.2.jar…5,529,556バイトgroovy-2.0.1.jar…3,270,730バイト➡切り出されたもの: groovy-ant, groovy-bsf, groovy-console, groovy-docgenerator,
groovy-groovydoc, groovy-groovysh, groovy-jmx, groovy-json, groovy-jsr223, groovy-servlet, groovy-sql, groovy-swing, groovy-templates, groovy-test, groovy-testng, groovy-xml
利用者(Groovyプログラマ)にはあまり影響ないmaven pomモジュールとしても分割されている依存性がきっちり定義されている
31
groovy-X.X.X.jarを「拡張モジュール」の集合として再構成
2.0新機能
しゅりんく!
12年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
モジュール化(2)拡張モジュールは「カスタム拡張メソッド」を提供できるGDKメソッドのように既存クラスにメソッドを追加するカテゴリとは異なり、静的Groovy配下で利用可能
@Grabで取り込んだ場合でもカスタム拡張メソッドは有効。
拡張モジュールは誰でも作れ、実体は以下のような内容の「org.codehaus.groovy.runtime.ExtensionModule」ファイルをMETA-INF/services directoryに含めたJarファイル
32
moduleName=groovy-‐streammoduleVersion=0.5.1extensionClasses=groovy.stream.StreamExtensionstaticExtensionClasses=
12年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.33
まとめhttp://www.flickr.com/photos/limonada/214375219/
12年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
Groovyの今後(1)Groovy 2.1遅くとも2012年中invokedynamicバイトコード命令サポートを完成させるDelegateTo(DSLに対する静的型サポート)言語レベルの改良も継続的に行っている
Groovy 3.02013年
GEP11 - Groovy 3 semantics and new MOPとして検討invokedynamicを前提としたMOP(Groovyの動的コア)の全面見直し
invokedynamicサポートから最大の利点を得るGroovy自体をもっとGroovy自身で書き直す
3412年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
まとめ静的Groovyは2.0の目玉ではあるものの、誰もが使わなければならないものでもない実開発への適用はもうちょっと待った方が良いかもGrailsでの採用を経て鍛錬されることを期待indy対応はまだまだですね今後は、非標準拡張モジュールによるエコシステム成長(プラグイン化)が期待される
3512年10月27日土曜日
Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
参考URL・商標http://www.slideshare.net/glaforge/groovy-20-devoxx-france-2012http://www.infoq.com/jp/articles/new-groovy-20http://www.jroller.com/melix/entry/groovy_2_0_from_anhttp://docs.codehaus.org/display/GROOVY/Creating+an+extension+modulehttp://d.hatena.ne.jp/ksky/20100513/p1http://docs.codehaus.org/display/GroovyJSR/GEP+11+-+Groovy+3+semantics+and+new+MOPhttp://glaforge.appspot.com/article/minor-new-features-of-groovy-2-0http://glaforge.appspot.com/article/incomplete-string-regex-matchinghttp://docs.oracle.com/javase/specs/jvms/se7/jvms7.pdfhttp://melix.github.com/talks/s2gx-typechecking/slides.htmlhttp://m.infoworld.com/d/application-development/groovy-the-roadmap-the-popular-jvm-language-202990?page=0,1OracleとJavaは、Oracle Corporation 及びその子会社、関連会社の米国及びその他の国における登録商標です。文中の社名、商品名等は各社の商標または登録商標である場合があります。記載されているロゴ、システム名、製品名は各社及び商標権者の登録商標あるいは商標です
3612年10月27日土曜日