我有一个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
指针。我通过动态扩展上下文的元类并将上下文设置为运行闭包的委托来实现这一点(使用DELEGATE_FIRST
作为解析策略)。
目前我正在努力进行类型检查。在执行运行闭包之前,我想检查method1
是否真的期望prop1
。我查看了DelegatesTo注释,但这似乎不适用于动态扩展对象。我也玩过AST,但由于我对这个话题的了解有限,我还没有找到解决方案。如果我想实现的目标是可行的,那么正确方向的任何指针都将非常受欢迎。
答案 0 :(得分:1)
您希望在运行时向上下文添加方法,然后在执行该方法之前键入check this。
类型检查在编译时完成。这是在你的程序执行之前。通常没有机会检查任何只会在运行时发生的事情,除非您有办法静态声明并给编译器执行检查的能力。但这通常意味着你必须进行静态编译。
一种方法是使用type checking extensions,但我认为在你的情况下可能有点矫枉过正。一种更简单的方法是使用extension modules。最简单的方法是使用custom script base class。
但是对于任何这些解决方案,您都需要静态编译才能真正进行类型检查,对于DelegatesTo(更多地与扩展模块结合使用)也是如此。对于经过类型检查的DSL,类型检查扩展和扩展模块的混合可以很好地工作。但是你当然会失去语言的更多动态特性和一些简单性。