Professional Documents
Culture Documents
Xtend API and DSL Design Patterns EclipseConFrance2016
Xtend API and DSL Design Patterns EclipseConFrance2016
Intro – Xtend
− Its syntax is flexible allowing definition of internal DSLs and interesting APIs
− This presentation will show some ways how the syntax can be utilized
MatthiasHeyde
©Matthias
© FOKUS
FraunhoferFOKUS
Heyde//Fraunhofer
2
© Fraunhofer FOKUS
XTEND – API AND DSL DESIGN PATTERNS
Intro – Patterns
MatthiasHeyde
©Matthias
© FOKUS
FraunhoferFOKUS
Heyde//Fraunhofer
3
© Fraunhofer FOKUS
XTEND – API AND DSL DESIGN PATTERNS
− Extension methods
emphasize("boo") ⇨ "boo".emphasize
− Operator overloading
FOKUS
FraunhoferFOKUS
operator_plus(1e15bd, 1e-4bd) ⇨ 1e15bd + 1e-4bd
Heyde//Fraunhofer
MatthiasHeyde
− Active annotations
©Matthias
©
4
© Fraunhofer FOKUS
XTEND – API AND DSL DESIGN PATTERNS
Pattern Overview
− Type Providers
− API Xtendification
5
© Fraunhofer FOKUS
XTEND – API AND DSL DESIGN PATTERNS
− Can be exploited to create internal DSLs that look like nested blocks
− Declarative look, while being imperative
6
© Fraunhofer FOKUS
XTEND – API AND DSL DESIGN PATTERNS
7
© Fraunhofer FOKUS
XTEND – API AND DSL DESIGN PATTERNS
8
© Fraunhofer FOKUS
XTEND – API AND DSL DESIGN PATTERNS
9
© Fraunhofer FOKUS
XTEND – API AND DSL DESIGN PATTERNS
10
© Fraunhofer FOKUS
XTEND – API AND DSL DESIGN PATTERNS
Signal /
11
© Fraunhofer FOKUS
XTEND – API AND DSL DESIGN PATTERNS
match bob.parental_status {
Parents { mom: Some(ref mother), dad: Some(ref father) }
=> println!("Mother: {:?}, Father: {:?}", father.name, mother.name),
Orphan { orphanage: ref institute }
=> println!("Orphanage: {:?}", institute),
Unknown
=> println!("Parental status unknown"),
_ => {}
}
12
© Fraunhofer FOKUS
XTEND – API AND DSL DESIGN PATTERNS
− Allows binding of field values to variable names (e.g. ref mother in example)
13
© Fraunhofer FOKUS
XTEND – API AND DSL DESIGN PATTERNS
14
© Fraunhofer FOKUS
XTEND – API AND DSL DESIGN PATTERNS
daredevil.parentalStatus
.caseParents [ mom, dad |
println('''Mother: «mom.name», Father: «dad.name»''')
].caseOrphan [ orphanage |
println("Orphanage: " + orphanage)
].caseUnknown [
println("Unknown parental status")
]
15
© Fraunhofer FOKUS
XTEND – API AND DSL DESIGN PATTERNS
16
© Fraunhofer FOKUS
XTEND – API AND DSL DESIGN PATTERNS
− Most times the powerful switch statement or multiple dispatch is good enough
17
© Fraunhofer FOKUS
XTEND – API AND DSL DESIGN PATTERNS
− Depending on usage (capturing in lambdas), may have runtime and memory overhead
18
© Fraunhofer FOKUS
XTEND – API AND DSL DESIGN PATTERNS
19
© Fraunhofer FOKUS
XTEND – API AND DSL DESIGN PATTERNS
20
© Fraunhofer FOKUS
XTEND – API AND DSL DESIGN PATTERNS
− Example:
λ
val p = ImmutablePerson.create [
firstName = "Mack"
lastName = "The Knife"
]
21
© Fraunhofer FOKUS
XTEND – API AND DSL DESIGN PATTERNS
22
© Fraunhofer FOKUS
XTEND – API AND DSL DESIGN PATTERNS
23
© Fraunhofer FOKUS
XTEND – API AND DSL DESIGN PATTERNS
class ImmutablePerson {
// ...
def ImmutablePerson firstName((String)=>String mapper) {
val newFirstName = mapper.apply(firstName)
new ImmutablePerson(newFirstName, lastName)
}
}
24
© Fraunhofer FOKUS
XTEND – API AND DSL DESIGN PATTERNS
25
© Fraunhofer FOKUS
XTEND – API AND DSL DESIGN PATTERNS
Manipulation by builder
26
© Fraunhofer FOKUS
XTEND – API AND DSL DESIGN PATTERNS
homer = homer.with [
firstName = "Max"
lastName = "Power"
]
27
© Fraunhofer FOKUS
XTEND – API AND DSL DESIGN PATTERNS
28
© Fraunhofer FOKUS
XTEND – API AND DSL DESIGN PATTERNS
− Some language features of Xtend only shine when API is shaped in a certain way
29
© Fraunhofer FOKUS
XTEND – API AND DSL DESIGN PATTERNS
30
© Fraunhofer FOKUS
XTEND – API AND DSL DESIGN PATTERNS
− When not using variables, long parameter lists are hard to understand
31
© Fraunhofer FOKUS
XTEND – API AND DSL DESIGN PATTERNS
32
© Fraunhofer FOKUS
XTEND – API AND DSL DESIGN PATTERNS
33
© Fraunhofer FOKUS
XTEND – API AND DSL DESIGN PATTERNS
− Extension method call with class object of class ThreadPoolExecutor as first param
34
© Fraunhofer FOKUS
XTEND – API AND DSL DESIGN PATTERNS
35
© Fraunhofer FOKUS
XTEND – API AND DSL DESIGN PATTERNS
Summary
36
© Fraunhofer FOKUS
37
© Fraunhofer FOKUS
XTEND – API AND DSL DESIGN PATTERNS
− Examples repository:
https://github.com/Boereck/eclipsecon_france_2016-xtend_patterns
− Useful?
− Interesting?
− Impractical?
− Too obvious?
38
© Fraunhofer FOKUS
XTEND – API AND DSL DESIGN PATTERNS
Image Sources
− Max Power:
http://25.media.tumblr.com/tumblr_lxxowbwXTs1qhkm9yo1_400.gif
− Joda Pug:
https://unsplash.com/photos/2Ts5HnA67k8
39
© Fraunhofer FOKUS
XTEND – API AND DSL DESIGN PATTERNS
− Method references
− Default methods
40
© Fraunhofer FOKUS
CONTACT
Fraunhofer FOKUS
Kaiserin-Augusta-Allee 31
10589 Berlin, Germany
www.fokus.fraunhofer.de
Max Bureck
Senior Researcher
max.bureck@fokus.fraunhofer.de
Phone +49 (0)30 3463-7321
41
© Fraunhofer FOKUS