Groovy - 执行前类型检查关闭代码
Groovy - Type Check Closure Code Before Execution
我有一个 Groovy script
允许用户定义一些动态属性和方法,然后执行用户定义的闭包。脚本如下所示:
// init properties and methods dynamically at runtime
context.prop1 = "Some test value"
context.method1 = { String input ->
"exec " + input.toUpperCase()
}
// "this" is set to the context variable from above
run {
println method1( prop1 )
}
所以在脚本的开头,一个 context
被初始化为用户定义的属性(例如 prop1
)和方法(例如 method1
)。然后上下文在 运行 闭包中用作 this
指针。我通过动态扩展上下文的元 class 并将上下文设置为 运行 闭包的委托(使用 DELEGATE_FIRST
作为解析策略)实现了这一点。
目前我正在努力类型检查。在执行 运行 闭包之前,我想检查 method1
是否真的期望 prop1
。我查看了 DelegatesTo 注释,但这似乎不适用于动态扩展的对象。我也玩过 AST,但由于我对该主题的了解有限,所以我还没有想出解决方案。如果我想要实现的目标是可能的,将不胜感激任何指向正确方向的指示。
您想在运行时将方法添加到上下文,然后在执行该方法之前键入检查。
类型检查在编译时完成。那是在执行任何程序之前。通常这不可能检查任何只会在运行时发生的事情,除非你有办法静态声明它并赋予编译器进行检查的权力。但这意味着通常情况下,您将不得不进行静态编译。
一种方法是使用 type checking extensions, but I think in your case that might be overkill. A more simple way would be to use extension modules. And the most simple way would be to use custom script base class。
但是对于这些解决方案中的任何一个,您都需要静态编译才能真正进行类型检查,DelegatesTo 也是如此(更多地与扩展模块结合使用)。对于类型检查的 DSL,类型检查扩展和扩展模块的组合可以很好地工作。但是你当然会失去语言的更多动态特性和一些简单性。
我有一个 Groovy script
允许用户定义一些动态属性和方法,然后执行用户定义的闭包。脚本如下所示:
// init properties and methods dynamically at runtime
context.prop1 = "Some test value"
context.method1 = { String input ->
"exec " + input.toUpperCase()
}
// "this" is set to the context variable from above
run {
println method1( prop1 )
}
所以在脚本的开头,一个 context
被初始化为用户定义的属性(例如 prop1
)和方法(例如 method1
)。然后上下文在 运行 闭包中用作 this
指针。我通过动态扩展上下文的元 class 并将上下文设置为 运行 闭包的委托(使用 DELEGATE_FIRST
作为解析策略)实现了这一点。
目前我正在努力类型检查。在执行 运行 闭包之前,我想检查 method1
是否真的期望 prop1
。我查看了 DelegatesTo 注释,但这似乎不适用于动态扩展的对象。我也玩过 AST,但由于我对该主题的了解有限,所以我还没有想出解决方案。如果我想要实现的目标是可能的,将不胜感激任何指向正确方向的指示。
您想在运行时将方法添加到上下文,然后在执行该方法之前键入检查。
类型检查在编译时完成。那是在执行任何程序之前。通常这不可能检查任何只会在运行时发生的事情,除非你有办法静态声明它并赋予编译器进行检查的权力。但这意味着通常情况下,您将不得不进行静态编译。
一种方法是使用 type checking extensions, but I think in your case that might be overkill. A more simple way would be to use extension modules. And the most simple way would be to use custom script base class。
但是对于这些解决方案中的任何一个,您都需要静态编译才能真正进行类型检查,DelegatesTo 也是如此(更多地与扩展模块结合使用)。对于类型检查的 DSL,类型检查扩展和扩展模块的组合可以很好地工作。但是你当然会失去语言的更多动态特性和一些简单性。