Groovyなう&ふゅーちゃーに出席しました。

Groovyなう&ふゅーちゃーに出席しました。

Groovy1.6の最新情報です。
私はまだ1.5ユーザーですが、1.6を使いたい理由は、速い、safe reference operatorが使える。
Java7との親和性も当然高まっています。

資料:

http://grails-ja.googlegroups.com/web/GroovyNowAndFuture.ppt

ustream:

http://www.ustream.tv/channel/grailscodereading-16

以下は、出席したときのメモ書き

Groovy 1.6について
エルビス演算子 ?:
三項演算子相当
A?: B とは if(A) {A} else {B}
Java7のは safe reference operator相当 Rubyの場合は .? と書く
ジョイントコンパイラ
Class A {
B b;
}
Class B extends A{}
コンパイルできなかった "groovyc -j" で実行可能

JavaScriptの様に、クラスも、インスタンスも動的にメソッド書き換え可能、
 無秩序すぎないか、
  Grailsだったらmetaclassの中でのみ動的な変更可能となっており、整理できる。

Expando Meta Class (EMC)
多重代入
分岐してもreturn省略可能 
AST変換
EMS DSL
実行時Mixed-in
ツールGrape
最初は、Javaの数十倍遅かった、
The Computer Language Bechmarks Game a.k.a "shootout"
Groovyで遅いならそこだけJava化すればよいだけ
ライブラリの性能はJavaと同じ
1.5.6までは遅かったが、1.6からは速い ただし起動は遅くなった
メソッド呼び出しが高速化した JRubyRuby1.9相当の速度
 "CallSite" cache の実装、2回目以降は、呼び出し側が保持する、みつけたmethodを再利用する 
  expandoMetaclassであっても発見容易
 "CallSite-Array"という新規な変数を持ち、探索コストがなくなる
DefaultGroovyMethod#additionals を参照
インライン展開 HotSpot Deoptimization

Grape 依存クラス自動Downloader
Maven/RubyGems みたいなもの Ivyとはモジュール管理に特化したMaven
走行中もDownloadできる
Grape.grab(group:'org.jidesoft',version:':[2.2.9)'))

Javaでもインスタンスのmetaclass変更可能
"xxx".metaClass.a ={print "hello"}
"xxx".a()

AST変換
Groovy.JDBC で現的的に使っていた
.netLINQ もやっていた
Groovyとしてsyntex errorを起こすものは変更できない
@Bindable / @Vetoable = Java.beans.propertyChangeSupport
@Singleton
@Immutable
@Delegate
@Lazy 遅延生成
@Category / @Mixin
@PackageScope
Retention Policy = Source の扱い、多分マクロの位置づけ

String.mixin Date
assert "a".getTime() == xxxxx エポックからの時間が分かる、意味不明になりがち

マルチ代入
def (a,b) =[1,2] <-- def a=1; def b=2 のこと

if(x%2==0) {true} else {false} <-- 2カ所でreturnできる

EMC DSL 一気にメソッドが定義できる String.metaClass.define { ここにメソッドがいっぱ書ける}
 これでメソッドが中途半端に追加された状態が隠せる

Grape の annotation表記は冗長
Javaアノテーションは methodとclassのみ
MOPのリフレッシュ予定あり NG言語のコアが役に立つ