java one - designing a dsl in kotlin
TRANSCRIPT
![Page 1: Java One - Designing a DSL in Kotlin](https://reader033.vdocuments.mx/reader033/viewer/2022051503/5a6764087f8b9a8a378b47e3/html5/thumbnails/1.jpg)
DESIGNING A DSL IN KOTLIN
@NICOLAS_FRANKEL
![Page 2: Java One - Designing a DSL in Kotlin](https://reader033.vdocuments.mx/reader033/viewer/2022051503/5a6764087f8b9a8a378b47e3/html5/thumbnails/2.jpg)
ME, MYSELF AND I
2
By day
• Consultant
By night
• Developer
• Blogger
• Book author
• Teacher/trainer
@nicolas_frankel #kotlin #dsl #kaadin
![Page 3: Java One - Designing a DSL in Kotlin](https://reader033.vdocuments.mx/reader033/viewer/2022051503/5a6764087f8b9a8a378b47e3/html5/thumbnails/3.jpg)
HYBRIS, AN SAP COMPANY
3@nicolas_frankel #kotlin #dsl #kaadin
![Page 4: Java One - Designing a DSL in Kotlin](https://reader033.vdocuments.mx/reader033/viewer/2022051503/5a6764087f8b9a8a378b47e3/html5/thumbnails/4.jpg)
A DSL?
4
“A Domain-Specific Language is a computer language specialized to a particular application domain. This is in contrast to a General-Purpose Language, which is broadly applicable across domains.”
-- Wikipedia
@nicolas_frankel #kotlin #dsl #kaadin
![Page 5: Java One - Designing a DSL in Kotlin](https://reader033.vdocuments.mx/reader033/viewer/2022051503/5a6764087f8b9a8a378b47e3/html5/thumbnails/5.jpg)
GPL/DSL EXAMPLES
GPL DSL
XML • HTML• MathML
Java • Hamcrest• AssertJ• Fest Assert
Kotlin • Anko• Kaadin• Bean DSL
5@nicolas_frankel #kotlin #dsl #kaadin
![Page 6: Java One - Designing a DSL in Kotlin](https://reader033.vdocuments.mx/reader033/viewer/2022051503/5a6764087f8b9a8a378b47e3/html5/thumbnails/6.jpg)
DESIGNING A DSL IN JAVA
6
Method Sequencing
Method Chaining
Nested Method Calls
Lambdas
https://dzone.com/articles/building-a-dsl-in-java
@nicolas_frankel #kotlin #dsl #kaadin
![Page 7: Java One - Designing a DSL in Kotlin](https://reader033.vdocuments.mx/reader033/viewer/2022051503/5a6764087f8b9a8a378b47e3/html5/thumbnails/7.jpg)
ASSERTJ SAMPLE
assertThat(frodo.getName())
.startsWith("Fro")
.endsWith("do")
.isEqualToIgnoringCase("frodo");
assertThat(fellowshipOfTheRing)
.filteredOn(c ->
c.getName().contains("o"))
.containsOnly(aragorn, frodo, legolas)
.extracting(c -> c.getRace().getName())
.contains("Hobbit", "Elf", "Man");
7@nicolas_frankel #kotlin #dsl #kaadin
![Page 8: Java One - Designing a DSL in Kotlin](https://reader033.vdocuments.mx/reader033/viewer/2022051503/5a6764087f8b9a8a378b47e3/html5/thumbnails/8.jpg)
KOTLIN
8
“Statically typed programming languagefor the JVM, Android and the browser”
-- http://kotlinlang.org/
@nicolas_frankel #kotlin #dsl #kaadin
![Page 9: Java One - Designing a DSL in Kotlin](https://reader033.vdocuments.mx/reader033/viewer/2022051503/5a6764087f8b9a8a378b47e3/html5/thumbnails/9.jpg)
A FEW FACTS
9
Developed by JetBrains
• Soon co-managed by Google
Open Source
Compiles to
• JVM bytecode
• JavaScript
• (Native)
A "simpler Scala"
@nicolas_frankel #kotlin #dsl #kaadin
![Page 10: Java One - Designing a DSL in Kotlin](https://reader033.vdocuments.mx/reader033/viewer/2022051503/5a6764087f8b9a8a378b47e3/html5/thumbnails/10.jpg)
KOTLIN FEATURES
10
Functional and object-oriented
Statically-typed
Null safe
No checked exceptions
Named & optional arguments
Lambdas
Extension functions
Java compatibility
(And more...)
@nicolas_frankel #kotlin #dsl #kaadin
![Page 11: Java One - Designing a DSL in Kotlin](https://reader033.vdocuments.mx/reader033/viewer/2022051503/5a6764087f8b9a8a378b47e3/html5/thumbnails/11.jpg)
SAMPLE: VAADIN UI
public class SampleUI extends UI {
@Override
protected void init(VaadinRequest req) {
setTheme("valo");
VerticalLayout layout = new VerticalLayout();
Label label =
new Label("<strong>Hello</strong>", HTML);
TextField field = new TextField("world!");
layout.addComponents(label, field);
layout.setMargin(true);
setContent(layout);
}
}
11
@nicolas_frankel #kotlin #dsl #kaadin
![Page 12: Java One - Designing a DSL in Kotlin](https://reader033.vdocuments.mx/reader033/viewer/2022051503/5a6764087f8b9a8a378b47e3/html5/thumbnails/12.jpg)
OUR GOAL FOR DSL
12
“Looks” declarative...
But is code
@nicolas_frankel #kotlin #dsl #kaadin
![Page 13: Java One - Designing a DSL in Kotlin](https://reader033.vdocuments.mx/reader033/viewer/2022051503/5a6764087f8b9a8a378b47e3/html5/thumbnails/13.jpg)
DECLARATIVE VAADIN UI
class KaadinSampler : UI() {
override fun init(req: VaadinRequest) {
theme = "valo"
verticalLayout(margin = true) {
html("<strong>Hello</strong>")
textField("world!")
}
}
}
13
@nicolas_frankel #kotlin #dsl #kaadin
![Page 14: Java One - Designing a DSL in Kotlin](https://reader033.vdocuments.mx/reader033/viewer/2022051503/5a6764087f8b9a8a378b47e3/html5/thumbnails/14.jpg)
DEMO!
14
@nicolas_frankel #kotlin #dsl #kaadin
![Page 15: Java One - Designing a DSL in Kotlin](https://reader033.vdocuments.mx/reader033/viewer/2022051503/5a6764087f8b9a8a378b47e3/html5/thumbnails/15.jpg)
WHY NOT GROOVY?
email {
from '[email protected]’
to '[email protected]’
subject 'The pope has resigned!’
body {
p 'Really, the pope has resigned!’
}
}
15
@nicolas_frankel #kotlin #dsl #kaadin
![Page 16: Java One - Designing a DSL in Kotlin](https://reader033.vdocuments.mx/reader033/viewer/2022051503/5a6764087f8b9a8a378b47e3/html5/thumbnails/16.jpg)
WHY NOT SCALA?
object SquareRoot extends Baysick {
def main(args:Array[String]) = {
10 PRINT "Enter a number"
20 INPUT 'n
30 PRINT "Square root of " % "'n is " % SQRT('n)
40 END RUN
}
}
16
@nicolas_frankel #kotlin #dsl #kaadin
![Page 17: Java One - Designing a DSL in Kotlin](https://reader033.vdocuments.mx/reader033/viewer/2022051503/5a6764087f8b9a8a378b47e3/html5/thumbnails/17.jpg)
TAKEAWAYS
1. 100% Java interoperability
2. Properties
3. Extension Functions
4. Named parameters
5. Default values
6. Lambdas with receiver
7. (Operator overloading)
8. (Infix)
17
@nicolas_frankel #kotlin #dsl #kaadin
![Page 18: Java One - Designing a DSL in Kotlin](https://reader033.vdocuments.mx/reader033/viewer/2022051503/5a6764087f8b9a8a378b47e3/html5/thumbnails/18.jpg)
Q&A
18
http://blog.frankel.ch/
@nicolas_frankel
http://frankel.in/
https://git.io/vd8d9
https://git.io/vHGER
@nicolas_frankel #kotlin #dsl #kaadin