带有嵌入式groovy脚本的Groovy DSL

时间:2011-12-13 19:28:01

标签: reflection groovy dsl

我正在编写一个用于在groovy中表达流程(我知道原创)的DSL。我想为用户提供编写在流程中某些点存储和评估的函数的能力。类似的东西:

states {
    "checkedState" {
        onEnter {state->
           //do some groovy things with state object
        }
    }
}

现在,我很确定我可以在引号中包围闭包并存储它。但是,如果可能的话,我希望在编辑这些DSL时保持语法高亮和内容辅助。我意识到封闭COULD引用了周围流定义中的工件,这些工件在不同的上下文中执行闭包时将不再有效,我对此很好。实际上,我想将闭包语法用于非闭包函数定义。

TL;博士;我需要在评估DSL时获取闭包的代码,以便它可以存储在数据库中,稍后由脚本主机执行。

1 个答案:

答案 0 :(得分:2)

我认为没有办法获取闭包的源代码,因为在编译期间会丢弃此信息。也许您可以尝试编写一个AST transformation来使闭包的语法树在运行时可用。

如果您只关心将闭包存储在数据库中,并且以后不需要访问源代码,则可以尝试对其进行序列化并存储序列化表单。

Closure实现Serializable,在将其ownerthisObjectdelegate属性归零后,我能够对其进行序列化,但我得到{关于反序列化的{1}}。

ClassNotFoundException

经过一番搜索,我找到了Groovy Remote Control,这是一个专门创建的库,可以在远程机器上启用序列化闭包并稍后执行它们。试一试,也许这就是你需要的。