因为要设计SPL,也可以说是DSL,采用Groovy,在chain调用的过程中发现两种方式。
类似构造器Builder类
每个方法返回对象本身,就可以不停调用,可以省略.和()。
通过使用execute(closure)方法,可以使闭包内的语法更加灵活。
def execute(closure){
closure.delegate=this
closure.call()
}
static main(args){
//类方法
metaFuc1 2 metaFuc1 2 metaFuc2 3,4
println "=============================================="
//实例方法
new GroovyIntp().instanceFuc1 1 instanceFuc2 2,3 instanceFuc1 4
println "=============================================="
GroovyIntp gi=new GroovyIntp()
gi.execute{
instanceFuc1 1
instanceFuc2 2,3 instanceFuc1 4
}
}
使用类似GroovyScript的模式匹配
这个方式适合Script使用,因为是运行的时候产生一个hashmap的对象存放他可以使用的闭包的入口,每次运行都会动态编译一次,所以效率很低,而且在方法很多的时候无法获得调用的方法的名称,所以无法进行反射,在operator较多的时候要写很长很长的模式匹配代码。所以~也不带清楚为何要这样用,在《Groovy for Domain-specific Languages - Second Edition》一书中看见此用法,是推荐的语法链用法,真的很低效,也跟踪了挺久的源码,可以通过更改groovy源码,org.codehaus.groovy.runtime.InvokerHelper中的createMap方法,将需要添加的方法反射加入到map中进行调用
static def deposit (double amount) {
[
currency: { Currency currency ->
[to: { account ->
account.balance += convert( currency , amount )
}
]
}
]
}
static main(args){
deposit 2.0 currency "USD" to somebody
}