Slide 1

Slide 1 text

REFLECTION ON 14 YEARS OF APACHE GROOVY HOW LANGUAGES INFLUENCE EACH OTHER GUILLAUME LAFORGE Apache Groovy PMC Chair Developer Advocate @ Google Cloud
 @glaforge

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

@glaforge INTRODUCTION APACHE GROOVY ▸ Groovy was born in 2003 ▸ Created by James Strachan & Bob McWhirter ▸ I joined the project in 2003 — 14 years ago! ▸ Currently serving as Chair of the Project Management Committee ▸ Groovy moved to the Apache Software Foundation to become Apache Groovy ▸ after Pivotal stopped funding the project 3

Slide 4

Slide 4 text

@glaforge INTRODUCTION DOWNLOAD NUMBERS TO BE PROUD OF 4 Move to ASF 30M+ for 2/3 of ’17 23M in 2016 13M in 2015 4.6M in 2014 3.2M in 2013 1.7 in 2012

Slide 5

Slide 5 text

C FAMILY MEMBER OF THE

Slide 6

Slide 6 text

@glaforge C FAMILY APACHE GROOVY PART OF THE C-FAMILY ▸ Like Java, C#, C++, JavaScript, D, Go, Swift, Dart, or even PHP :-)
 Apache Groovy is part of the C-family of languages ▸ Key syntax characteristics ▸ Curly braces delimit blocks ▸ No whitespace indentation ▸ Signatures of the form: type functionName(parameters) { … } ▸ Usual control structures: if/else, switch/case, for/while loops… 6

Slide 7

Slide 7 text

99% JAVA Java’s close cousin

Slide 8

Slide 8 text

@glaforge C FAMILY JAVA’S CLOSE COUSIN — A VALID GROOVY PROGRAM TOO! 8 public class HelloWorld { private String name; public void setName(String name) { this.name = name; } public String getName() { return name; } public String greet() { return "Hello " + name; } public static void main(String[] args) { HelloWorld helloWorld = new HelloWorld(); helloWorld.setName("Groovy"); System.out.println(helloWorld.greet()); } }

Slide 9

Slide 9 text

@glaforge C FAMILY JAVA’S CLOSE COUSIN — MORE IDIOMATIC! 9 class HelloWorld { String name def greet() { "Hello ${name}" } } def helloWorld = new HelloWorld(name: "Groovy") println helloWorld.greet()

Slide 10

Slide 10 text

STRINGS MORE THAN FOUR

Slide 11

Slide 11 text

@glaforge STRINGS STRINGS INSPIRED BY PYTHON 11 {

Slide 12

Slide 12 text

@glaforge STRINGS STRINGS INSPIRED BY PYTHON 12 def firstname = 'Guillaume' def address = ''' 1st Main Street CA 94123 San Francisco '''

Slide 13

Slide 13 text

@glaforge STRINGS STRINGS INSPIRED BY PYTHON 13 def firstname = "Guillaume" def address = """ 1st Main Street CA 94123 San Francisco """

Slide 14

Slide 14 text

@glaforge STRINGS STRING INTERPOLATION SIMILAR TO RUBY AND ANT 14 def firstname = 'Guillaume' def lastname = 'Laforge' def name = "Mr ${firstname} $lastname"

Slide 15

Slide 15 text

@glaforge STRINGS LAZY INTERPOLATION 15 def a = 'a' def b = 'b' def s = "${a} ${-> b}" assert s == 'a b' a = 'x' b = 'y' assert s == 'a y'

Slide 16

Slide 16 text

@glaforge STRINGS MOAARRR STRINGS… 16 /The forward \/ slash/ $/ c:\ and /usr/local /$

Slide 17

Slide 17 text

CLOSURES FUNCTIONAL ORIENTATION

Slide 18

Slide 18 text

@glaforge FUNCTIONAL ORIENTATION A FIRST APPROACH WITH RUBY’S AND SMALLTALK SYNTAX 18 // smalltalk [ :a | a * 2 ] // ruby {| a | a * 2 }

Slide 19

Slide 19 text

@glaforge FUNCTIONAL ORIENTATION A FIRST APPROACH WITH RUBY’S AND SMALLTALK SYNTAX 19 def d = { a | a * 2 }

Slide 20

Slide 20 text

@glaforge FUNCTIONAL ORIENTATION PROBLEM WITH BINARY AND LOGICAL OR FOR DEFAULT PARAMETERS 20 def d = { a = 1 | 2 | a * 2 }

Slide 21

Slide 21 text

@glaforge FUNCTIONAL ORIENTATION ARROWS TO THE RESCUE! 21 def d = { a = 1 | 2 -> a * 2 }

Slide 22

Slide 22 text

CLASS INTERFACE, TRAIT, ABSTRACT

Slide 23

Slide 23 text

@glaforge OBJECT ORIENTATION CLASS, ABSTRACT CLASS, INTERFACE… LIKE JAVA 23 class A {} abstract class B {} interface C {}

Slide 24

Slide 24 text

@glaforge OBJECT ORIENTATION TRAITS… A LA SCALA THEATER 24 trait FlyingAbility { String fly() { "I'm flying!" } } trait SpeakingAbility { String speak() { "I'm speaking!" } } class Duck implements FlyingAbility, SpeakingAbility {} def d = new Duck() assert d.fly() == "I'm flying!" assert d.speak() == "I'm speaking!"

Slide 25

Slide 25 text

SMALLTALK

Slide 26

Slide 26 text

@glaforge SMALLTALK INFLUENCE NAMED PARAMETERS 26 // smalltalk Rectangle red width: 100 height: 200 // groovy rectangle red, width: 100, height: 200 def rectangle(Map m, Color r) { println "$m.width:$m.height $r" }

Slide 27

Slide 27 text

@glaforge SMALLTALK INFLUENCE COLLECTION METHODS NAMES 27 // map // #(1, 2, 3, 4) collect: [ :it | :it * 2 ] assert (1..4).collect { it * 2 } == [2, 4, 6, 8] // foldLeft // #(1, 2, 3) inject: 0 into: [ :count :item | count + item ] assert [1, 2, 3].inject(0) { count, item -> count + item } == 6

Slide 28

Slide 28 text

COLLECTIONS LISTS, MAPS…

Slide 29

Slide 29 text

@glaforge LISTS, MAPS, COLLECTIONS… NATIVE SYNTAX FOR DATA STRUCTURES 29 // python lists def list = [1, 2, 3] // like python maps // but with square brackets def map = [a: 1, b: 2]

Slide 30

Slide 30 text

INSPIRED OTHERS BUT APACHE GROOVY ALSO

Slide 31

Slide 31 text

No content

Slide 32

Slide 32 text

CLOSURE TRAILING

Slide 33

Slide 33 text

@glaforge CLOSURE TRAILING CLOSURE 33 def unless(boolean b, Closure action) { if (!b) action() } unless(false, { println "xyz" }) unless(false) { println "xyz" }

Slide 34

Slide 34 text

KOTLIN THE ISLAND OF

Slide 35

Slide 35 text

@glaforge KOTLIN KOTLIN, A MIX OF JAVA, SCALA, AND… APACHE GROOVY ▸ Kotlin adopted ▸ the syntax of Groovy closures and its ‘it’ default parameter, ▸ the notation for trailing closures ▸ Groovy’s builder concept ▸ Kotlin’s data classes, delegate and lazy mechanisms, follow Groovy’s @Immutable, @Delegate and @Lazy transformations ▸ Method name convention based operator overloading 35

Slide 36

Slide 36 text

@glaforge KOTLIN KOTLIN, A MIX OF JAVA, SCALA, AND… APACHE GROOVY ▸ Kotlin adopted Groovy’s optional semicolons ▸ Groovy’s Elvis operator ▸ Groovy’s null-safe navigation operator ▸ but with a different approach with non/nullable types ▸ Groovy’s interpolated strings (dollar placeholders with & without curly braces) ▸ Groovy’s import aliasing 36

Slide 37

Slide 37 text

@glaforge KOTLIN GROOVY’S BUILDER 37 html { head { title ("a title") } body { h1 ("first header") p ("a paragraph") } } html { head { title {+"a title"} } body { h1 {+"first header"} p {+"a paragraph"} } }

Slide 38

Slide 38 text

NAVIGATION NULL-SAFE

Slide 39

Slide 39 text

@glaforge INSPIRED OTHERS NULL-SAFE NAVIGATION OPERATOR 39

Slide 40

Slide 40 text

@glaforge INSPIRED OTHERS NULL-SAFE NAVIGATION OPERATOR 40 def name = book?.author?.name

Slide 41

Slide 41 text

ELVIS CALLING

Slide 42

Slide 42 text

@glaforge INSPIRED OTHERS THE ELVIS OPERATOR 42

Slide 43

Slide 43 text

@glaforge INSPIRED OTHERS THE ELVIS OPERATOR 43 def name = book?.author?.name ?: 'Unknown'

Slide 44

Slide 44 text

RANGES

Slide 45

Slide 45 text

@glaforge INSPIRED OTHERS RANGES 45 // Ruby style initially // 1..4 == [1, 2, 3, 4] and 1...4 == [1, 2, 3] // ..< is more visual assert 1..4 == [1, 2, 3, 4] assert 1..<4 == [1, 2, 3] // Swift adopted 1..<4

Slide 46

Slide 46 text

SPACESHIP AN OPERATOR FLYING LIKE A

Slide 47

Slide 47 text

@glaforge INSPIRED OTHERS THE SPACESHIP OPERATOR 47 assert (1 <=> 1) == 0 assert (1 <=> 2) == -1 assert (2 <=> 1) == 1 assert ('a' <=> 'z') == -1

Slide 48

Slide 48 text

SUMMARY GUILLAUME LAFORGE Apache Groovy PMC Chair Developer Advocate @ Google Cloud
 @glaforge

Slide 49

Slide 49 text

INSPIRATION IS A TWO-WAY STREET Be influenced and influence others

Slide 50

Slide 50 text

NO LANGUAGE IS PERFECT But they’re all improving!

Slide 51

Slide 51 text

THANKS Q & A GUILLAUME LAFORGE Apache Groovy PMC Chair Developer Advocate @ Google Cloud
 @glaforge