3. DSL building blocks
• Lambdas without parentheses
• Lambdas with receivers
• Extension functions
4. Lambdas without parentheses
fun person(block: (Person) -> Unit): Person {
val p = Person()
block(p)
return p
}
val person = person {
it.name = "John"
it.age = 25
}
val person = person({ p ->
p.name = "John"
p.age = 25
})
5. Lambdas with receivers
fun person(block: Person.() -> Unit): Person {
val p = Person()
p.block()
return p
}
val person = person {
name = "John"
age = 25
}
fun person(block: Person.() -> Unit): Person
= Person().apply(block)
6. Extension functions
fun Person.address(block: Address.() -> Unit) {
address = Address().apply(block)
}
val person = person {
name = "John"
age = 25
address {
street = "Main Street"
number = 42
city = "London"
}
}
7. val person = person {
"John" age 25
addresses {
address {
street = "Main Street"
number = 12
city = "London"
}
address {
street = "Dev Avenue"
number = 42
city = "Paris"
}
}
}
8. Who uses the DSL?
• Libraries: Coroutines, Ktor, Exposed
• Gradle Kotlin DSL