Groovy闭包中的方法调用跟踪

Groovy闭包中的方法调用跟踪,groovy,dsl,reactive-programming,Groovy,Dsl,Reactive Programming,我正在编写一个用于反应式评估的小型DSL,需要Groovy中元编程方面的帮助 DSL代码示例: Signal<Integer> a = var(1) Signal<Integer> b = var(2) Signal<Integer> c = signal { a(it) + b(it) } 有没有办法传递it变量,使示例看起来像 Signal<Integer> a = var(1) Signal<Integer> b = var(2

我正在编写一个用于反应式评估的小型DSL,需要Groovy中元编程方面的帮助

DSL代码示例:

Signal<Integer> a = var(1)
Signal<Integer> b = var(2)
Signal<Integer> c = signal { a(it) + b(it) }
有没有办法传递
it
变量,使示例看起来像

Signal<Integer> a = var(1)
Signal<Integer> b = var(2)
Signal<Integer> c = signal { a() + b() }
DSL的测试用例:

def a = var(1)
def b = var(2)

def c = signal { a() + b() }

assert c.now() == 3
assert c.dependencies.contains(a)
assert c.dependencies.contains(b)
问题是:“有没有办法避免传递it变量?” 由于a和b是局部变量,并且局部变量不参与MOP,所以使用运行时元编程应该是不可能的

使用转换是可能的,但我不知道您是否想在这里走那么远

问题是:“有没有办法避免传递it变量?” 由于a和b是局部变量,并且局部变量不参与MOP,所以使用运行时元编程应该是不可能的


使用转换是可能的,但我不知道你是否想在这里走那么远

什么是
var(1)
var(2)
在做什么?@tim\u yates它创建了新的
信号
实例
var(1)
var(2)
在做什么?@tim\u yates它创建了新的
信号
实例
class SignalStub<T> implements Signal<T> {
    T value
    Collection<Signal<?>> dependencies

    static def var(value) { new SignalStub<>(value: value, dependencies: [])}
    static def createSignal(deps, body) { new SignalStub<Object>(value: body.call(), dependencies: deps) }

    @Override
    T now() {
        return value
    }
}
def a = var(1)
def b = var(2)

def c = signal { a() + b() }

assert c.now() == 3
assert c.dependencies.contains(a)
assert c.dependencies.contains(b)