groovy, state of the union - groovy grails exchange 2010 - guillaume laforge
DESCRIPTION
Keynote given at the Groovy / Grails eXchange conference in LondonTRANSCRIPT
![Page 1: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/1.jpg)
jeudi 16 décembre 2010
![Page 2: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/2.jpg)
jeudi 16 décembre 2010
![Page 3: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/3.jpg)
State of the Unionjeudi 16 décembre 2010
![Page 4: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/4.jpg)
State of the Unionjeudi 16 décembre 2010
![Page 5: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/5.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Guillaume Laforge / @glaforge
• Groovy Project Manager• Head of Groovy Development
at SpringSource• Initiator of the Grails framework• Founder of the Gaelyk toolkit• Co-author of Groovy in Action• Member of «Les Cast Codeurs» podcast
• Speaker: JavaOne, QCon, JavaZone, Sun TechDays, Devoxx, The Spring Experience, SpringOne2GX, JAX, Dynamic Language World, IJTC, and more...
2jeudi 16 décembre 2010
![Page 6: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/6.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Agenda
•Past–Groovy 1.6 flashback
•Present–Groovy 1.7 novelties–A few Groovy 1.7.x refinements
•Future–What’s cooking for 1.8 and beyond
3jeudi 16 décembre 2010
![Page 7: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/7.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
But first... some figures...
4
0
50000
100000
150000
200000
déc.-07 févr.-08 avr.-08 juin-08 août-08 oct.-08 janv.-09 mars-09 mai-09 juil.-09 sept.-09 nov.-09 janv.-10 mars-10 mai-10 juil.-10
Groovy downloads per monthDownloads Moving Average (year)
jeudi 16 décembre 2010
![Page 8: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/8.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
But first... some figures...
4
0
50000
100000
150000
200000
déc.-07 févr.-08 avr.-08 juin-08 août-08 oct.-08 janv.-09 mars-09 mai-09 juil.-09 sept.-09 nov.-09 janv.-10 mars-10 mai-10 juil.-10
Groovy downloads per monthDownloads Moving Average (year)
jeudi 16 décembre 2010
![Page 9: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/9.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
But first... some figures...
4
0
50000
100000
150000
200000
déc.-07 févr.-08 avr.-08 juin-08 août-08 oct.-08 janv.-09 mars-09 mai-09 juil.-09 sept.-09 nov.-09 janv.-10 mars-10 mai-10 juil.-10
Groovy downloads per monthDownloads Moving Average (year)
Groovy 1.5
jeudi 16 décembre 2010
![Page 10: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/10.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
But first... some figures...
4
0
50000
100000
150000
200000
déc.-07 févr.-08 avr.-08 juin-08 août-08 oct.-08 janv.-09 mars-09 mai-09 juil.-09 sept.-09 nov.-09 janv.-10 mars-10 mai-10 juil.-10
Groovy downloads per monthDownloads Moving Average (year)
Groovy 1.5
jeudi 16 décembre 2010
![Page 11: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/11.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
But first... some figures...
4
0
50000
100000
150000
200000
déc.-07 févr.-08 avr.-08 juin-08 août-08 oct.-08 janv.-09 mars-09 mai-09 juil.-09 sept.-09 nov.-09 janv.-10 mars-10 mai-10 juil.-10
Groovy downloads per monthDownloads Moving Average (year)
Groovy 1.5
G2Oneacquisition
jeudi 16 décembre 2010
![Page 12: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/12.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
But first... some figures...
4
0
50000
100000
150000
200000
déc.-07 févr.-08 avr.-08 juin-08 août-08 oct.-08 janv.-09 mars-09 mai-09 juil.-09 sept.-09 nov.-09 janv.-10 mars-10 mai-10 juil.-10
Groovy downloads per monthDownloads Moving Average (year)
Groovy 1.5
G2Oneacquisition
jeudi 16 décembre 2010
![Page 13: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/13.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
But first... some figures...
4
0
50000
100000
150000
200000
déc.-07 févr.-08 avr.-08 juin-08 août-08 oct.-08 janv.-09 mars-09 mai-09 juil.-09 sept.-09 nov.-09 janv.-10 mars-10 mai-10 juil.-10
Groovy downloads per monthDownloads Moving Average (year)
Groovy 1.5
G2Oneacquisition
Groovy 1.6
jeudi 16 décembre 2010
![Page 14: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/14.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
But first... some figures...
4
0
50000
100000
150000
200000
déc.-07 févr.-08 avr.-08 juin-08 août-08 oct.-08 janv.-09 mars-09 mai-09 juil.-09 sept.-09 nov.-09 janv.-10 mars-10 mai-10 juil.-10
Groovy downloads per monthDownloads Moving Average (year)
Groovy 1.5
G2Oneacquisition
Groovy 1.6
jeudi 16 décembre 2010
![Page 15: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/15.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
But first... some figures...
4
0
50000
100000
150000
200000
déc.-07 févr.-08 avr.-08 juin-08 août-08 oct.-08 janv.-09 mars-09 mai-09 juil.-09 sept.-09 nov.-09 janv.-10 mars-10 mai-10 juil.-10
Groovy downloads per monthDownloads Moving Average (year)
Groovy 1.5
G2Oneacquisition
Groovy 1.6
Groovy 1.7
jeudi 16 décembre 2010
![Page 16: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/16.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
But first... some figures...
4
0
50000
100000
150000
200000
déc.-07 févr.-08 avr.-08 juin-08 août-08 oct.-08 janv.-09 mars-09 mai-09 juil.-09 sept.-09 nov.-09 janv.-10 mars-10 mai-10 juil.-10
Groovy downloads per monthDownloads Moving Average (year)
Groovy 1.5
G2Oneacquisition
Groovy 1.6
Groovy 1.7
185Kjeudi 16 décembre 2010
![Page 17: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/17.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Groovy 1.7.6 and 1.8-beta-3
5jeudi 16 décembre 2010
![Page 18: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/18.jpg)
looking into the Pastjeudi 16 décembre 2010
![Page 19: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/19.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Big highlights of Groovy 1.6
• Greater compile-time and runtime performance• Multiple assignments• Optional return for if/else and try/catch/finally• Java 5 annotation definition• AST Transformations• The Grape module and dependency system• Various Swing related improvements• JMX Builder• Metaprogramming additions• JSR-223 scripting engine built-in• Out-of-the-box OSGi support
7jeudi 16 décembre 2010
![Page 20: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/20.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Big highlights of Groovy 1.6
• Greater compile-time and runtime performance• Multiple assignments• Optional return for if/else and try/catch/finally• Java 5 annotation definition• AST Transformations• The Grape module and dependency system• Various Swing related improvements• JMX Builder• Metaprogramming additions• JSR-223 scripting engine built-in• Out-of-the-box OSGi support
8jeudi 16 décembre 2010
![Page 21: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/21.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Multiple assignement
// multiple assignmentdef (a, b) = [1, 2]assert a == 1 && b == 2
// with typed variablesdef (int c, String d) = [3, "Hi"]assert c == 3 && d == "Hi"
def geocode(String place) { [48.8, 2.3] }def lat, lng// assignment to existing variables(lat, lng) = geocode('Paris')
// classical variable swaping example(a, b) = [b, a]
9jeudi 16 décembre 2010
![Page 22: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/22.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
More optional return
// optional return for if statements
def m1() { if (true) 1 else 0}assert m1() == 1
// optional return for try/catch/finally
def m2(bool) { try { if (bool) throw new Exception()
1 } catch (any) { 2 } finally { 3 }}assert m2(true) == 2 && m2(false) == 1
10jeudi 16 décembre 2010
![Page 23: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/23.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
AST Transformation (1/2)
• Groovy 1.6 introduced AST Transformations–AST: Abstract Syntax Tree
• Ability to change what’s being compiled by the Groovy compiler... at compile time–No runtime impact!–Change the semantics of your programs! Even hijack the
Groovy syntax!–Implementing recurring patterns in your code base–Remove boiler-plate code
• Two kinds: global and local–triggered by annotations
11jeudi 16 décembre 2010
![Page 24: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/24.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
AST Transformations (2/2)
• Transformations introduced in 1.6–@Singleton–@Immutable, @Lazy, @Delegate–@Newify–@Category, @Mixin–@PackageScope–Swing’s @Bindable and @Vetoable–Grape’s own @Grab
12jeudi 16 décembre 2010
![Page 25: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/25.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
@Immutable
• To properly implement immutable classes–No mutations — state musn’t change–Private final fields–Defensive copying of mutable components–Proper equals() / hashCode() / toString()
for comparisons or as keys in maps
@Immutable class Coordinates { Double lat, lng}def c1 = new Coordinates(lat: 48.8, lng: 2.5)
def c2 = new Coordinates(48.8, 2.5)assert c1 == c2
13jeudi 16 décembre 2010
![Page 26: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/26.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Grab a grape!
• Simple distribution and sharing of Groovy scripts• Dependencies stored locally
–Can even use your own local repositories
@Grab(group = 'org.mortbay.jetty',
module = 'jetty‐embedded',
version = '6.1.0')
def startServer() { def srv = new Server(8080)
def ctx = new Context(srv , "/", SESSIONS)
ctx.resourceBase = "."
ctx.addServlet(GroovyServlet, "*.groovy")
srv.start()}
14jeudi 16 décembre 2010
![Page 27: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/27.jpg)
into the Present...jeudi 16 décembre 2010
![Page 28: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/28.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Big highlights of Groovy 1.7
• Anonymous Inner Classes and Nested Classes• Annotations anywhere• Grape improvements• Power Asserts• AST Viewer• AST Builder• Customize the Groovy Truth!• Rewrite of the GroovyScriptEngine• Groovy Console improvements• SQL support refinements
16jeudi 16 décembre 2010
![Page 29: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/29.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Big highlights of Groovy 1.7
• Anonymous Inner Classes and Nested Classes• Annotations anywhere• Grape improvements• Power Asserts• AST Viewer• AST Builder• Customize the Groovy Truth!• Rewrite of the GroovyScriptEngine• Groovy Console improvements• SQL support refinements
17jeudi 16 décembre 2010
![Page 30: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/30.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
AIC and NC
• Anonymous Inner Classes and Nested Classes
18jeudi 16 décembre 2010
![Page 31: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/31.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
AIC and NC
• Anonymous Inner Classes and Nested Classes
For Java
copy’n paste
compatibility
sake :-)
18jeudi 16 décembre 2010
![Page 32: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/32.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Annonymous Inner Classes
boolean called = false
Timer timer = new Timer()
timer.schedule(new TimerTask() {
void run() {
called = true
}}, 0)
sleep 100assert called
19jeudi 16 décembre 2010
![Page 33: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/33.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Annonymous Inner Classes
boolean called = false
Timer timer = new Timer()
timer.schedule(new TimerTask() {
void run() {
called = true
}}, 0)
sleep 100assert called
{ called = true } as TimerTask
19jeudi 16 décembre 2010
![Page 34: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/34.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Nested Classes
class Environment { static class Production extends Environment {}
static class Development extends Environment {}
}
new Environment.Production()
20jeudi 16 décembre 2010
![Page 35: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/35.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Anotations almost anywhere
• You can put annotations–on imports–on packages–on variable declarations
• Examples with @Grab following...
21jeudi 16 décembre 2010
![Page 36: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/36.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Grape improvements (1/4)
• @Grab on import
@Grab(group = 'net.sf.json‐lib',
module = 'json‐lib', version = '2.3', classifier = 'jdk15')import net.sf.json.groovy.*
assert new JsonSlurper().parseText(
new JsonGroovyBuilder().json {
book(title: "Groovy in Action",
author: "Dierk König et al")
}.toString()).book.title == "Groovy in Action"
22jeudi 16 décembre 2010
![Page 37: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/37.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Grape improvements (2/4)
• Shorter module / artifact / version parameter–Example of an annotation on a variable declaration
@Grab('net.sf.json‐lib:json‐lib:2.3:jdk15')
def builder = new net.sf.json.groovy.JsonGroovyBuilder()
def books = builder.books { book(title: "Groovy in Action", author: "Dierk Koenig")
}assert books.toString() == '{"books":{"book":{"title":"Groovy in Action",' +
'"author":"Dierk Koenig"}}}'
23jeudi 16 décembre 2010
![Page 38: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/38.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Grape improvements (3/4)
• Groovy 1.7 introduced Grab resolver–For when you need to specify a specific repository
for a given dependency
@GrabResolver( name = 'restlet.org', root = 'http://maven.restlet.org')
@Grab('org.restlet:org.restlet:1.1.6')
import org.restlet.Restlet
24jeudi 16 décembre 2010
![Page 39: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/39.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Power Asserts (1/2)
• Much better assert statement!–Invented and developed in the Spock framework
• Given this script...
def energy = 7200 * 10**15 + 1def mass = 80def celerity = 300000000
assert energy == mass * celerity ** 2
25jeudi 16 décembre 2010
![Page 40: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/40.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Power Asserts (2/2)
• You’ll get a more comprehensible output
26jeudi 16 décembre 2010
![Page 41: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/41.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Easier AST Transformations
• AST Transformations are a very powerful feature
• But are still rather hard to develop–Need to know the AST API closely
• To help with authoring your own transformations, we’ve introduced–the AST Viewer in the Groovy Console–the AST Builder
27jeudi 16 décembre 2010
![Page 42: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/42.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
AST Viewer
28jeudi 16 décembre 2010
![Page 43: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/43.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
AST Builder
// Ability to build AST parts
// ‐‐> from a Stringnew AstBuilder().buildFromString(''' "Hello" '''
)
// ‐‐> from codenew AstBuilder().buildFromCode { "Hello" }
// ‐‐> from a specification
List<ASTNode> nodes = new AstBuilder().buildFromSpec {
block { returnStatement {
constant "Hello"
} }}
29jeudi 16 décembre 2010
![Page 44: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/44.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Customize the Groovy Truth!
• Ability to customize the truth by implementing a boolean asBoolean() method
class Predicate { boolean value boolean asBoolean() { value }
}
def truePred = new Predicate(value: true)
def falsePred = new Predicate(value: false)
assert truePred && !falsePred
30jeudi 16 décembre 2010
![Page 45: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/45.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Groovy 1.7.x changes
• Since Groovy 1.7.0...Groovy 1.7.1, 1.7.2, 1.7.3, 1.7.4, 1.7.5 and 1.7.6 have been released already!
• Here’s what’s new!
31jeudi 16 décembre 2010
![Page 46: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/46.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Grape improvements (4/4)
• Groovy 1.7.5 even further shrinks the grab resolver definition:
32
@GrabResolver('http://maven.restlet.org')
@Grab('org.restlet:org.restlet:1.1.6')
import org.restlet.Restlet
jeudi 16 décembre 2010
![Page 47: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/47.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Map improvements (1/2)
// map auto‐vificationdef m = [:].withDefault { key ‐> "Default" }
assert m['z'] == "Default"
assert m['a'] == "Default"
// default sort, sort with a comparator
m.sort()m.sort({ a, b ‐> a <=> b } as Comparator)
// max{} and min{}assert [a: 1, b: 2].max{ it.value }.value == 2
33jeudi 16 décembre 2010
![Page 48: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/48.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Map improvements (2/2)
// before Map#withDefault()
def words = "one two two three three three".split()
def freq = [:]
words.each { if (it in freq) freq[it] += 1 else freq[it] = 1 }
34jeudi 16 décembre 2010
![Page 49: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/49.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Map improvements (2/2)
// after Map#withDefault()
def words = "one two two three three three".split()
def freq = [:].withDefault { k ‐> 0 }
words.each {
freq[it] += 1
}
35jeudi 16 décembre 2010
![Page 50: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/50.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
XML back to String
• Ability to retrieve the XML string from a node from an XmlSlurper GPathResult
def xml = """<books> <book isbn="12345">Groovy in Action</book>
</books>"""def root = new XmlSlurper().parseText(xml)
def someNode = root.bookdef builder = new StreamingMarkupBuilder()
assert builder.bindNode(someNode).toString() ==
"<book isbn='12345'>Groovy in Action</book>"
36jeudi 16 décembre 2010
![Page 51: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/51.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Currying improvements
// right curryingdef divide = { a, b ‐> a / b }
def halver = divide.rcurry(2)
assert halver(8) == 4 // currying n‐th parameterdef joinWithSeparator = { one, sep, two ‐>
one + sep + two}def joinWithComma = joinWithSeparator.ncurry(1, ', ')
assert joinWithComma('a', 'b') == 'a, b'
37jeudi 16 décembre 2010
![Page 52: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/52.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Date improvements
import static java.util.Calendar.*
// convert to calendardef cal = new Date().toCalendar()
// update a date (or a calendar)
cal.set(year: cal[YEAR] + 1)
cal[MONTH] = MARCH
// create a new date (or a calendar) from one
def nextYear = cal.updated(year: cal[YEAR] + 1)
38jeudi 16 décembre 2010
![Page 53: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/53.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
New String methods
println """ def method() { return 'bar' }""".stripIndent()
println """ |def method() { | return 'bar' |}""".stripMargin('|')
// string "translation" (UNIX tr)
assert 'hello'.tr('z‐a', 'Z‐A') == 'HELLO'
assert 'Hello World!'.tr('a‐z', 'A') == 'HAAAA WAAAA!'
assert 'Hello World!'.tr('lloo', '1234') == 'He224 W4r2d!'
// capitalize the first letter
assert 'h'.capitalize() == 'H'
assert 'hello'.capitalize() == 'Hello'
assert 'hello world'.capitalize() == 'Hello world'
// tab/space (un)expansion (UNIX expand command)
assert '1234567\t8\t '.expand() == '1234567 8 '
assert ' x '.unexpand() == ' x\t '
39jeudi 16 décembre 2010
![Page 54: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/54.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Map supports isCase()
40
def m = [a: 1, b: 2]def val = 'a'
switch (val) { case m: "key in map"; break
// equivalent to // case { val in m }: ...
default: "not in map"}
jeudi 16 décembre 2010
![Page 55: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/55.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
(G)String to Enum coercion
41
enum Color { red, green, blue}
// coercion with asdef r = "red" as Color
// implicit coercionColor b = "blue"
// with GStrings toodef g = "${'green'}" as Color
jeudi 16 décembre 2010
![Page 56: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/56.jpg)
...and beyond!jeudi 16 décembre 2010
![Page 57: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/57.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Groovy 1.8 & beyond
• Still subject to discussion• Always evolving roadmap• Things may change!
43jeudi 16 décembre 2010
![Page 58: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/58.jpg)
What’s cooking?jeudi 16 décembre 2010
![Page 59: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/59.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
What we’re working on
• More runtime performance improvements• Closures
–annotation parameterscomposition, memoization, and trampoline
• Native JSON support–builder and parser
• New AST transformations• Gradle build• Modularizing Groovy• Align with JDK 7 / Java 7 / Project Coin• Enhanced DSL support
45jeudi 16 décembre 2010
![Page 60: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/60.jpg)
jeudi 16 décembre 2010
![Page 61: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/61.jpg)
G
jeudi 16 décembre 2010
![Page 62: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/62.jpg)
jeudi 16 décembre 2010
![Page 63: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/63.jpg)
jeudi 16 décembre 2010
![Page 64: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/64.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
An example, with Fibonacci
48jeudi 16 décembre 2010
![Page 65: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/65.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
An example, with Fibonacci
• Known example of worst case performance for Groovy
48jeudi 16 décembre 2010
![Page 66: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/66.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
An example, with Fibonacci
• Known example of worst case performance for Groovy
48jeudi 16 décembre 2010
![Page 67: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/67.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
An example, with Fibonacci
• Known example of worst case performance for Groovy
• Groovy 1.7.5 vs Java–25131ms / 1110ms –22x slower!
48jeudi 16 décembre 2010
![Page 68: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/68.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
An example, with Fibonacci
• Known example of worst case performance for Groovy
• Groovy 1.7.5 vs Java–25131ms / 1110ms –22x slower!
48jeudi 16 décembre 2010
![Page 69: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/69.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
An example, with Fibonacci
• Known example of worst case performance for Groovy
• Groovy 1.7.5 vs Java–25131ms / 1110ms –22x slower!
• Groovy 1.8-beta-3 vs Java–1871ms / 1110ms–only 68% slower
48jeudi 16 décembre 2010
![Page 70: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/70.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
An example, with Fibonacci
• Known example of worst case performance for Groovy
• Groovy 1.7.5 vs Java–25131ms / 1110ms –22x slower!
• Groovy 1.8-beta-3 vs Java–1871ms / 1110ms–only 68% slower
48
13xjeudi 16 décembre 2010
![Page 71: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/71.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Optimizations for int
• Currently, the optimizations cover most of native operations on primitive ints–Be careful, your mileage may vary
• To come next–optimizations for doubles–improving array accesses–then other primitives optimizations–and mixed cases of primitives
49jeudi 16 décembre 2010
![Page 72: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/72.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Closure annotation parameters
• Groovy 1.5 brought Java 5 annotations
• What if... we could go beyond what Java offered?–In 1.7, we can put annotations on packages, imports and
variable declarations–But annotations are still limited in terms of parameters
they allow
• Here comes closure annotation parameters!–Groovy 1.8 will give us the ability to access annotation
with closure parameters at runtime
50jeudi 16 décembre 2010
![Page 73: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/73.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
GContracts
• Closures are already allowed in the Groovy 1.7 Antlr grammar–André Steingreß created GContracts,
a «design by contract» module
// a class invariant@Invariant({ name.size() > 0 && age > ageLimit() })
class Person { String name; int age }
// a method pre‐condition@Requires({ message != null })void greet(String message) { ... }
// a method post‐condition@Ensures({ returnResult % 2 == 0 })
int evenResult() { ... }
51jeudi 16 décembre 2010
![Page 74: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/74.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Closure composition
• Functional flavor!
52
def plus2 = { it + 2 }def times3 = { it * 3 } def composed1 = plus2 << times3assert composed1(3) == 11assert composed1(4) == plus2(times3(4))
def composed2 = times3 << plus2assert composed2(3) == 15assert composed2(5) == times3(plus2(5))
// reverse compositionassert composed1(3) == (times3 >> plus2)(3)
jeudi 16 décembre 2010
![Page 75: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/75.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Closure memoization
• Memoization: remember the outcome of previous (ideally side-effect free) invocations
53
def c = { a, b ‐> sleep 1000; a + b }.memoize()
assert c(1, 2) == 3 // after 1000ms
assert c(1, 2) == 3 // return immediately
// other forms:// at least 10 invocations cached
def cAtLeast = { ... }.memoizeAtLeast(10)
// at most 10 invocations cacheddef cAtMost = { ... }.memoizeAtMost(10)
// between 10 and 20 invocations cached
def cAtLeast = { ... }.memoizeBetween(10, 20)
jeudi 16 décembre 2010
![Page 76: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/76.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Closure trampoline
• No more infamous StackOvervlow errors for deeply recursive algorithms–if you use closure trampolines explicitely
54
def factfact = { int n, BigInteger accu ‐>
n > 1 ? fact.trampoline(n ‐ 1, n * accu) : accu
}.trampoline()
def factorial = { int n ‐> fact(n, 1G) }
assert factorial(1) == 1assert factorial(3) == 6assert factorial(1000) == 402387260077...
jeudi 16 décembre 2010
![Page 77: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/77.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
New AST xforms (1/2)
• Many new transformations coming up for removing even more boiler plate code
55
@Log inject a logger in your classes@Field creates a field in your scripts@PackageScope improvements (methods & fields)@Synchronized providing safer synchronization semantics@InheritConstructor ex. when extending Exception@IndexedProperties JavaBeans indexed property support@AutoClone automatic cloning of your beans@AutoExternalizable automatic externalization of your beans
jeudi 16 décembre 2010
![Page 78: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/78.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
New AST xforms (2/2)
56
@ThreadInterrupt makes a script interruptible@TimedInterrupt interrupt after a period of time@ConditionalInterrupt interrupt with a custom condition
@Canonical adds equals, hashCode, toString, ctor- @EqualsAndHashCode just equals and hashCode- @ToString just toString- @TupleConstructor adds a «tuple» constructor
jeudi 16 décembre 2010
![Page 79: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/79.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Java 7 / 8 / Project Coin
• Alignment with JDK 7 will come in Groovy 1.9• JSR-292 InvokeDynamic• Simple Closures (8)
• Proposals from Project Coin–Strings in switch (7)–Automatic Resource Management (7)–Improved generics type inference (diamond <>) (7)–Simplified varargs method invocation (7)–Better integral literals (7)–Language support for collections (8?)
57jeudi 16 décembre 2010
![Page 80: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/80.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Java 7 / 8 / Project Coin
• Alignment with JDK 7 will come in Groovy 1.9• JSR-292 InvokeDynamic• Simple Closures (8)
• Proposals from Project Coin–Strings in switch (7)–Automatic Resource Management (7)–Improved generics type inference (diamond <>) (7)–Simplified varargs method invocation (7)–Better integral literals (7)–Language support for collections (8?)
57jeudi 16 décembre 2010
![Page 81: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/81.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Java 7 / 8 / Project Coin
• Alignment with JDK 7 will come in Groovy 1.9• JSR-292 InvokeDynamic• Simple Closures (8)
• Proposals from Project Coin–Strings in switch (7)–Automatic Resource Management (7)–Improved generics type inference (diamond <>) (7)–Simplified varargs method invocation (7)–Better integral literals (7)–Language support for collections (8?)
57jeudi 16 décembre 2010
![Page 82: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/82.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Java 7 / 8 / Project Coin
• Alignment with JDK 7 will come in Groovy 1.9• JSR-292 InvokeDynamic• Simple Closures (8)
• Proposals from Project Coin–Strings in switch (7)–Automatic Resource Management (7)–Improved generics type inference (diamond <>) (7)–Simplified varargs method invocation (7)–Better integral literals (7)–Language support for collections (8?)
57jeudi 16 décembre 2010
![Page 83: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/83.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Java 7 / 8 / Project Coin
• Alignment with JDK 7 will come in Groovy 1.9• JSR-292 InvokeDynamic• Simple Closures (8)
• Proposals from Project Coin–Strings in switch (7)–Automatic Resource Management (7)–Improved generics type inference (diamond <>) (7)–Simplified varargs method invocation (7)–Better integral literals (7)–Language support for collections (8?)
57jeudi 16 décembre 2010
![Page 84: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/84.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Improved DSL support
• GEP-3: an extended command expression DSL–Groovy Extension Proposal #3
• Command expressions–basically top-level statements without parens–combine named and non-named arguments in the mix
•for nicer Domain-Specific Languages–(methodName arguments)*
58jeudi 16 décembre 2010
![Page 85: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/85.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Before GEP-3
• The idea: extend command-expressions, beyond top-level statements, for chained method calls
• Before
send("Hello").to("Graeme")
check(that: margherita).tastes(good)
sell(100.shares).of(MSFT)
take(2.pills).of(chloroquinine).after(6.hours)
wait(10.minutes).and(execute { })
blend(red, green).of(acrylic)
59jeudi 16 décembre 2010
![Page 86: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/86.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
With GEP-3
• The idea: extend command-expressions, beyond top-level statements, for chained method calls
• After
send "Hello" to "Graeme"
check that: margherita tastes good
sell 100.shares of MSFT
take 2.pills of chloroquinine after 6.hours
wait 10.minutes and execute { }
blend red, green of acrylic
60jeudi 16 décembre 2010
![Page 87: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/87.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
With GEP-3
• The idea: extend command-expressions, beyond top-level statements, for chained method calls
• After
send "Hello" to "Graeme"
check that: margherita tastes good
sell 100.shares of MSFT
take 2.pills of chloroquinine after 6.hours
wait 10.minutes and execute { }
blend red, green of acrylic
Less parens& commas
60jeudi 16 décembre 2010
![Page 88: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/88.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
The pattern
• A repetition of–method name–arguments (mix of named and normal)
61
check that: margherita tastes good
methodname
methodname
parameternamed parameter
jeudi 16 décembre 2010
![Page 89: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/89.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Summary
• No need to wait for Java 7, 8, 9...–closures, properties, interpolated strings, extended
annotations, metaprogramming, [YOU NAME IT]...
62jeudi 16 décembre 2010
![Page 90: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/90.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Summary
• No need to wait for Java 7, 8, 9...–closures, properties, interpolated strings, extended
annotations, metaprogramming, [YOU NAME IT]...
Groovy’s still
innovative
since 2003!
62jeudi 16 décembre 2010
![Page 91: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/91.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Summary
• No need to wait for Java 7, 8, 9...–closures, properties, interpolated strings, extended
annotations, metaprogramming, [YOU NAME IT]...
Groovy’s still
innovative
since 2003!
62jeudi 16 décembre 2010
![Page 92: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/92.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Q and A
jeudi 16 décembre 2010
![Page 93: Groovy, State of the Union - Groovy Grails eXchange 2010 - Guillaume Laforge](https://reader034.vdocument.in/reader034/viewer/2022052505/555875e1d8b42a8d018b52cb/html5/thumbnails/93.jpg)
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Picture credits
Myself http://www.flickr.com/photos/romainguy/783719255/sizes/l/in/photostream/Big hat http://cdn.plussizecostumesupercenter.com/csc_inc/images/items/343x432/47703.jpgRIP http://gipsydan.files.wordpress.com/2009/11/rip.jpgHouse / past: http://www.flickr.com/photos/jasonepowell/3680030831/sizes/o/Present clock: http://www.flickr.com/photos/38629278@N04/3784344944/sizes/o/Future: http://www.flickr.com/photos/befuddledsenses/2904000882/sizes/l/Cooking: http://www.flickr.com/photos/eole/449958332/sizes/l/Snail http://www.freakingnews.com/images/app_images/snail-0.jpgUsein bolt record http://www.phombo.com/sports/usain-bolt-beijing-2008-olympics/17450/full/popular/Fibonacci figure http://cnx.org/content/m22060/latest/graphics1.jpgFibonacci face http://www.robinkelly.co.nz/site/acupil/images/lfib.jpgPuzzle: http://www.everystockphoto.com/photo.php?imageId=263521Light bulb: https://newsline.llnl.gov/retooling/mar/03.28.08_images/lightBulb.pngCheck mark: http://www.lnl.infn.it/~epics/WikiDumps/localhost/600px-symbol_ok.svg.pngPuzzle: http://www.everystockphoto.com/photo.php?imageId=263521Light bulb: https://newsline.llnl.gov/retooling/mar/03.28.08_images/lightBulb.pngGreen leaf: http://www.flickr.com/photos/epsos/3384297473/Trafic light: http://rihancompany.com/var/243/35581-Traffic%20light%20drawing.jpgButt kick: http://www.brentcsutoras.com/wp-content/uploads/2009/12/kick-ass-1.jpg
64jeudi 16 décembre 2010