Top Banner
Compile-time and Runtime Metaprogramming with Groovy Scott Davis, ThirstyHead.com
54

Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.

Mar 31, 2020

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.

Compile-time and Runtime Metaprogramming with Groovy

Scott Davis, ThirstyHead.com

Page 2: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.
Page 3: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.

@scottdavis99Scott Davis

Page 4: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.
Page 5: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.

inheritance

Page 6: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.
Page 7: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.

metaprogramming

Page 8: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.
Page 9: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.

Categories

RuntimeExpandoMetaClassMethodMissing

Compile- timeAST Transformations

Page 10: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.

Categories(Runtime)

Page 11: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.
Page 12: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.
Page 13: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.

NOTE: Evolutionary dead-end in Java!

Page 14: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.
Page 15: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.
Page 16: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.

Category metaprogramming works with any library (Groovy, Java, or otherwise) as long as:

1. The method is static

2. The first argument of the method is the same data-type as the “delegate” class

java.lang.String (delegate)

StringUtils:static String abbreviate(String str, int maxWidth)

Page 17: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.
Page 18: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.

import org.apache.commons.lang.*;

public class TestJava{ public static void main(String[] args){ String sentence = "My name is Inigo Montoya."; System.out.println(sentence); System.out.println(StringUtils.abbreviate(sentence, 15)); }}

$ ./runJava.sh

My name is Inigo Montoya. My name is I...

Java:

Page 19: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.

import org.apache.commons.lang.*

use(StringUtils){ def sentence = "My name is Inigo Montoya." println sentence //NOTE: look at the cool new method // on java.lang.String!!! println sentence.abbreviate(15)}

$ ./runGroovy.sh

My name is Inigo Montoya. My name is I...

Groovy:

Page 20: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.
Page 21: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.

ExpandoMetaClass(Runtime)

Page 22: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.
Page 23: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.

def message = "I love groovy"

String.metaClass.shout = { return delegate.toUpperCase()}

println message.shout()

$ groovy shout

I LOVE GROOVY

Groovy (class-level metaprogramming):

Page 24: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.

def message = "I love groovy"

message.metaClass.shout = { return delegate.toUpperCase()}

println message.shout()

"java is ok, too".shout()

$ groovy shout

I LOVE GROOVYCaught: groovy.lang.MissingMethodException: No signature of method: java.lang.String.shout() is applicable for argument types: () values: []

Groovy (instance-level metaprogramming):

Page 25: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.
Page 26: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.

MethodMissing(Runtime)

Page 27: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.

invokeMethod()

Page 28: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.
Page 29: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.
Page 30: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.
Page 31: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.
Page 32: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.

class Person{ String name Map relationships = [:] Object invokeMethod(String what, Object who){ if(relationships.containsKey(what)){ who.each{thisPerson -> relationships.get(what).add(thisPerson) } } else{ relationships.put(what,who as List) } }}

def scott = new Person(name:"Scott") scott.married "Kim" scott.knows "Neal" scott.workedWith "Brian"scott.knows "Ted", "Ben", "David"println scott.relationships

["married" :["Kim" ],"knows":["Neal", "Venkat", "Ted", "Ben", "David"], "workedWith":["Brian", "Jared"]]

Page 33: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.

methodMissing()

Page 34: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.
Page 35: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.

class Ipod { ...

String spacify(String camelCase){ String title = "" camelCase.each{ char c = (char) it title += Character.isUpperCase(c) ? " ${c}" : "${c}" } title.trim() }

def methodMissing(String methodCall, Object arg){ if(methodCall.startsWith("play")){ // "playTwoOfUs" --> "TwoOfUs" return play(spacify(methodCall - "play")) } }}

Page 36: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.

ipod = new Ipod()ipod << new Song(title:"Two Of Us", duration:217)ipod << new Song(title:"Dig A Pony", duration:235)

println ipod.play("Dig A Pony")println ipod.playTwoOfUs() println ipod.playSomeOtherSong()

Page 37: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.

Expando

Page 38: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.
Page 39: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.

def e = new Expando()e.latitude = 70 e.longitude = 30 println e

e.areWeLost = {-> return (e.longitude != 30) || (e.latitude != 70)}

e.areWeLost()//===> false

Page 40: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.
Page 41: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.

AST Transformations(Compile-time)

Page 42: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.
Page 43: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.
Page 44: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.

@Delegate

Page 45: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.

NOTE: All of the Date field’s methods are “pushed up” to theEvent “parent” class

Page 46: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.

class AllCapsString{ @Delegate final String body

AllCapsString(String body){ this.body = body.toUpperCase() } String toString(){ body } }

Suppose we wanted to create a new type of String:AllCapsString

We cannot extend java.lang.String because it is final.

But we can use the @Delegate AST transformationto delegate all “String” calls to AllCapsString...

Page 47: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.

@Category

Page 48: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.
Page 49: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.
Page 50: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.
Page 51: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.

Categories

RuntimeExpandoMetaClassMethodMissing

Compile- timeAST Transformations

Page 52: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.

Compile-time and Runtime Metaprogramming with Groovy

Scott Davis, ThirstyHead.com

Page 53: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.

Questions?Thanks for your time.

[email protected]

@scottdavis99Scott Davis

Page 54: Compile-time and Runtime Scott Davis, ThirstyHead.com …scottdavis99.github.io/groovyMetaprogramming/groovyMeta... · 2012-04-17 · Metaprogramming with Groovy Scott Davis, ThirstyHead.com.

Image Credits

http://www.flickr.com/photos/timothymorgan/75294154/in/set-1615269/http://www.flickr.com/photos/cwalker71/2175839970/http://www.flickr.com/photos/34517346@N02/3464812992/http://www.flickr.com/photos/chrishedgate/3044800149/http://www.flickr.com/photos/andrewbain/3649614402/