由DSL来了解Groovy的语言特征

来源:百度文库 编辑:神马文学网 时间:2024/04/29 23:00:40

由DSL来了解Groovy的语言特征

Groovy是最适宜使用DSL(特定领域语言)的了。DSL是一种擅长于表现给定域(domain)的结构的迷你语言。Groovy提供了一系列特征来让你很容易在Groovy代码中嵌入DSL:

  • 建造器(builder)概念帮助你写树形结构的语言
  • 你可以通过类别(category)或者用户自定义元类(metaclass)随意地添加新方法和属性到原有类中,即便是数字也一样:3.euros、5.days等等,这篇文章也正如你所见的,解释了如何去写一个由迷你DSL组织起来的单元。
  • 绝大多数操作符都得到了重载:5.days+6.hours、myAccount+=400.euros。
  • 给方法传map对象使得你的代码看起来拥有了有了指定参数(named parameter):move( x: 500.meters, y: 1.kilometer )
  • 你也可以通过使用闭包作为方法最末参数的方式来创建你自己的控制结构:ifOnce( condition ){ … }; inTransaction { … }。
  • 当然,你也可以以实现Groovy对象或自定义元类的方式动态添加方法或属性(这些方法或属性并不真正存在但却可以被拦截并发挥效用)。

Guillaume Laforge已经在他的博客中提及了几则涉及以上内容的思想和示例,而John Wilson则在他的Google数据支持这一项目中使用DSL来简化对日期的操纵。

Joachim Baumann写了一篇说明如何用DSL来实现一个协助测量计算的文章,其中使用了诸如给数字添加属性或者重载运算符的技巧,同样的,Guillaume Laforge也写了一篇表现如何使用JScience类库来表现单元的文章。

Andy Glover的行为测试DSL探究了一番DSL内部机制。

来自Bruce Tate撰文IBMs Alphaworks探究了一组Groovy写的例子。

  • Chris van Buskirk使用array和map来模拟注入对状态变化的影响。
  • Edward Sumerfield使用闭包注入来改变状态。
  • RSpec(也包括Guy家族的某位高人)写了一则使用Groovy单元测试的例子。
  • Clifton Craig使用建造器来建立G文档。

当Groovy不够用的时候如果你需要完全设计你自己的语言,你可以考虑使用一个用于编译程序的编译器。当然,你有很多选择,比如Antlr、JavaCC、SableCC、Coco/R、Cup/JLex/JFl;ex、BYacc/J、Beaver等等。你大可以参考这一系列的维基内容,而且其中一些是完全支持Groovy的,这儿给了一个使用JParsec的Groovy例子。