function move(Block b, Position p) { // user-defined algorithm for moving block "b" to position "p" } Block a = getBlockA(); Position p = getPositionP(); move(a, p);
等等.请注意:以上只是一个示例,并不构成我希望实现的确切语法.我仍处于“30,000英尺视图”设计阶段,并且不知道我的混凝土脚本语言最终会是什么样子.我只提供此示例以表明它是用户必须编写的流/过程脚本,并且该XML可能不是其实现的最佳候选者.
XML,非常适合分层数据,对于这样的实现来说,感觉不是最佳选择(尽管我可以强制它在需要时工作).
我不知道有关DSL的舔,我已经开始阅读Groovy DSL,他们觉得这是我所需要的完美匹配.
我的理解是,我可以编写一个Groovy(我在Groovy中比Scala,JRuby等更强)DSL允许用户编写脚本(.groovy文件),然后我的程序可以在运行时作为输入执行.
这是正确的,还是我完全误解了DSL的意图?如果我弄错了,有人对我有什么建议吗?如果我是正确的,那么Java程序将如何读取和执行.groovy文件(换句话说,我的程序将如何“消耗”他们的脚本)?
编辑:我开始喜欢ANTLR了.虽然我很想卷起袖子写一个Groovy DSL,但我不希望我的用户能够编写他们想要的任何旧的Groovy程序.我想要自己的“微语言”,如果用户走出它,我希望解释器使脚本无效.看起来Groovy / DSL似乎不是正确的选择,也许ANTLR可能是我需要的解决方案……?
是的,您可以编写一个Groovy程序,它将接受脚本作为输入并执行它.我最近使用groovy以这种方式编写了一个BASIC DSL /解释器:http://cartesianproduct.wordpress.com/binsic-is-not-sinclair-instruction-code/
(最后它比DSL更多的解释,但这与Groovy的特性有关,可能不会影响你 – BASIC坚持使用Groovy难以解析的UPPER CASE关键字 – 因此它们必须转换为小写).
Groovy允许您以各种方式扩展脚本环境(例如,将变量注入绑定并将执行从当前脚本转移到另一个动态加载的脚本),这使得这相对简单.
精彩评论