Slide 1

Slide 1 text

Kotlin: The Next Frontier for Modern (Meta) Programming Amanda Hinchman-Dominguez @hinchman_amanda Kotlin, TornadoFX and Metaprogramming

Slide 2

Slide 2 text

Thomas Nield

Slide 3

Slide 3 text

TornadoFX a JavaFX Framework written in Kotlin

Slide 4

Slide 4 text

Characteristics of Functional Languages Functions are treated as first class citizens Functions have no side-effects Metaprogramming capabilities

Slide 5

Slide 5 text

Metaprogramming is magic!! • Programs that treat programs as data – read, analyze, or transform other programs • Metaprogramming can be used to make our lives easier

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

Primitive Filters remove(a, b) && ! or(a, b) )= || ( ( )= topEdge(a) )= shiftUp( == ) !( Piq: cesarloose

Slide 8

Slide 8 text

A READABLE Horizontal Edge

Slide 9

Slide 9 text

A MEMORY-OPTIMAL Horizontal Edge

Slide 10

Slide 10 text

Crosscutting = (Scattering && Tangling) • Scattering – when a source element is related to multiple target elements • Tangling – when a target element is related to multiple source elements • Crosscutting occurs if there exists both scattering & tangling • “spaghetti code” sources targets

Slide 11

Slide 11 text

Metaprogramming A solution to crosscutting • We sacrifice one domain design decision for another • Metaprogramming comes in different forms • Wizards - “Monkey patching” • Aspect-Oriented Programming (AOP) • Domain Specific Languages (DSLs) Flickr: Susan Lucas Hhoffman

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

Aspect-Oriented Programming (AOP) • AOP is how Java approaches crosscutting • Draws out a higher level of abstraction to act as a weaver between concerns Flickr: Chris Radcliffe

Slide 15

Slide 15 text

Memoization - optimization technique

Slide 16

Slide 16 text

Java Annotations API

Slide 17

Slide 17 text

How does Java achieve AOP? 1. Declare the @interface 2. Specify the @Retention and its targets 3. Add elements

Slide 18

Slide 18 text

How does Java achieve AOP? • Dynamic introspection prime for reflection • Runtime annotation carries through to the JVM

Slide 19

Slide 19 text

Current Shortcomings in Aspect-Oriented Programming • Annotations are only a form of metadata • No direct effect on the annotated code • Annotation processing occurs only at designated annotations • No dynamic generation for elements • True metaprogramming doesn’t play nicely with static types • Generating code without compiling risks type-checking • True metaprogramming does not respect encapsulation • Statically-typed languages overcomplicate

Slide 20

Slide 20 text

Imperative v. Declarative Programming Salting your food • An imperative approach (HOW): I see the salt is out of my reach. If I reach over the beans and the sauce and avoiding knocking the drinks over I could probably get it without brushing over my own food. • A declarative approach (WHAT): Pass the salt please. • Execution is more efficient • Reduced bugs Flickr: Joe King

Slide 21

Slide 21 text

Domain-Specific Languages (DSLs) • Regular DSLs • Cares about a specific concern and nothing else • Not a general purpose language & difficult to combine with • Kotlin creates internal DSLs • Uses its own language • Retains key advantages of DSLs

Slide 22

Slide 22 text

Type-Safe CSS • Blocks, or { }, can be passed when the terminal parameter is a function op -> () • Type-safe builders allows Kotlin-based DSLs to create complex hierarchies in a declarative way

Slide 23

Slide 23 text

Higher Order Functions and Lambdas Function as a Parameter

Slide 24

Slide 24 text

Function as a Parameter Parameter types Return type Receiver type Higher Order Functions and Lambdas

Slide 25

Slide 25 text

Parameter types Return type Receiver type Higher Order Functions and Lambdas A.(B) C or (A, B) C Function as a Parameter

Slide 26

Slide 26 text

Reified Generics • Function bytecode copies into every place where the function is called • When the function is called the compiler modifies the generated bytecode to use the corresponding class directly • Can be used • Type checks/casts • Use the Kotlin reflection API • As a type argument to call other functions

Slide 27

Slide 27 text

Scopes • simple constructs used to pass objects like models to other classes • Makes the View/Controller unique to a smaller subset of instances in an application

Slide 28

Slide 28 text

Passing Scopes to Components

Slide 29

Slide 29 text

Type parameter used in receiver and return types Generic-Class-as-a-Parameter Pattern Type parameter declaration – any Component may be passed

Slide 30

Slide 30 text

Passing Scopes with Reified Generics “reified” declares that this type parameter will not be erased at runtime

Slide 31

Slide 31 text

Passing Scopes to Components

Slide 32

Slide 32 text

• Metaprogramming is a solution to crosscutting • Common forms of metaprogramming has their shortcomings • TornadoFX leverages functional Kotlin features to streamline JavaFX The Takeaway

Slide 33

Slide 33 text

No content

Slide 34

Slide 34 text

TORNADOFX SUITE

Slide 35

Slide 35 text

• True reflection does not respect encapsulation • Generating code at runtime means no compiler for type- checking Challenges w/ Statically-Typed Metaprogramming

Slide 36

Slide 36 text

No content

Slide 37

Slide 37 text

Special Thanks Carl Walker @bekwaminc Edvin Syse @edvinsyse Thomas Neild @thomasneild9727 Ruckus T Boom @ruckustboom • #TornadoFX channel on Slack • Kotlin community • KotlinConf Committee • Ebad Ahmadzadeh

Slide 38

Slide 38 text

Noted Projects: • TornadoFX - https://github.com/edvin/tornadofx • TilesFX - https://github.com/HanSolo/tilesfx • TornadoFX-DnD-TilesFX – https://github.com/ahinchman1/TornadoFX-DnD-TilesFX • Neighborhood Cat Scheduler – https://github.com/Kotlin- Thursdays/Neighborhood-Cat-Scheduler • TornadoFX-Suite - https://github.com/ahinchman1/TornadoFX-Suite • Kastree - https://github.com/cretz/kastree