Groovy SPL 语法链设计

本文介绍了在设计SPL(领域特定语言)时,如何利用Groovy实现语法链调用。讨论了两种方法:一是通过构造器Builder类,允许连续调用方法;二是采用GroovyScript的模式匹配,虽然灵活但效率较低且不利于反射操作。作者指出,后者在《Groovy for Domain-specific Languages - Second Edition》中被推荐,但实际使用中可能需要权衡效率和便利性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为要设计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
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值