这些要感谢 Venkat Subramaniam 的有关 DSL 的讲座
venkat.jpg
作为我个人来说,自己看了 Venkat Subramaniam 的 presentation, 感觉将很清楚而且有深度。个人觉得受益匪浅所以在这里表示感谢。
学习许多有关 kotlin 语言本身对 DSL 的支持,这里我们来通过实践来整合一下学过的知识。要实现下面两个 DSL 语言。
2 days ago
2 days from now
先分析如何实现 2 days ago
这个语法,根据前面介绍我们感觉应该实现为2.day(aga)
。2 是 Int 类型的对象,所以可以通过扩展 Int 类方法 days 并且让 days 接收一个 String 参数。那么就可以这样写。
val ago = "ago"
fun Int.days(tense:String){
println("called")
}
还需要做点工作就是,去掉.(点)调用,怎么做之前已经介绍过了在 fun 前面加上修饰符 infix
infix fun Int.days(tense:String){
println("called")
}
infix fun Int.days(tense:String){
when(tense){
ago ->
println(LocalDateTime.now().minusDays(this.toLong()))
else -> println("?")
}
}
val ago = "ago"
val from_now = "from now"
infix fun Int.days(tense:String){
when(tense){
ago ->
println(LocalDateTime.now().minusDays(this.toLong()))
from_now ->
println(LocalDateTime.now().minusDays(this.toLong()))
else -> println("?")
}
}
接下来实现一个难点,实现下面的语句,这里 3..15 表示为 3:15
"planning" meeting {
start at 3..15
}
我们打印一下
println(3..5)
println((3..5).javaClass)
class kotlin.ranges.IntRange
从简入难
class Meeting(name:String){
}
fun String.meeting():Meeting{
return Meeting(this)
}
"planning".meeting {
// start at 3..15
}
infix fun String.meeting(block:()->Unit):Meeting{
return Meeting(this)
}
class Meeting(val name:String){
val start = this
infix fun at(time:IntRange){
println("$name starts at $time")
}
}
"planning" meeting {
start at 3..15
}
Learn-a-Programming-Language-Step-24.jpg