// HTML을 표현하는 DSL
body {
div {
a("https:/kotlinlang.org") {
target = ATarget.blank
+"Main Site"
}
}
}
fun Routing.api() {
route("news") {
get {
val newsData = NewsUseCase.getAcceptedNews()
call.responsd(newsData)
}
get("propositions") {
requireSecret()
val newsData = NewsUseCase.getPropositions()
call.respond(newsData)
}
}
}
fun plus(a: Int, b: Int) = a + b // 일반 함수
val plus1: (Int, Int) -> Int = { a, b -> a + b } // 람다 표현식
val plus2: (Int, Int) -> Int = fun(a, b) = a + b // 익명 함수
val plus3: (Int, Int) -> Int = ::plus // 함수 레퍼런스
val myPlus = fun Int.(other: Int) = this + other
myPlus.invoke(1, 2) // invoke 사용
myPlus(1, 2) // 확장 함수가 아닌 함수처럼 사용
1.myPlus(2) // 확장 함수로 사용
this 참조 대상을 변경할 수 있다는 점이다.
this 키워드는 확장 리시버(위 코드에선 Int 인스턴스)를 참조한다.fun createTable(): TableDSL = table {
tr {
for (i in 1..2) {
td { +"this is column &i" }
}
}
}
table 함수는 톱레벨에 위치하며 별도 리시버를 갖지 않으므로 table 함수도 톱레벨에 있어야 한다.table 함수 아규먼트 내부에서 tr을 사용하며 tr은 table 정의 내부에서만 허용되어야 하기에 table 함수 아규먼트는 tr 함수를 갖는 리시버를 가져야 한다.tr 함수의 아규먼트는 td 함수를 갖는 리시버를 가져야 한다.fun table(init: TableBuilder.() -> Unit): TableBuilder { /*...*/ }
class TableBuilder {
fun tr(init: TrBuilder.() -> Unit) { /*...*/ }
}
class TrBuilder {
fun td(init: TdBuilder.() -> Unit) { /*...*/ }
}