一:DSL 概念
指的是用于一个特定领域的语言(功能领域、业务领域)。在这个给出的概念中有 3个重点:
只用于一个特定领域,而非所有通用领域,比如 Java / C++就是用于通用领域,而不可被称为 DSL,同样也不可把 Groovy称为 DSL。
语言,必须经过编写后才可发挥它的功能。比如:五线谱编写后成乐谱; ANT编写用于编译; SVN命令编写后可对资源库进行操作; Shell编程; SQL编程; PL-SQL编程等等。
忽略具体的运行环境(媒介),可以是纸、 XML文件、命令行、 Shell、数据库等。
二:Groovy对 DSL的支持
Groovy不是 DSL,而是通用的编程语言。但 Groovy却对编写出一个全新的 DSL提供了良好的支持,这些支持都来自于 Groovy自身语法的特性,比如:
不需要 class定义,直接执行脚本
Groovy语法的简洁
Groovy提供了更多通俗易懂的方法
省略()和;等
等等
Groovy自身不是 DSL。 Groovy官方已经发布了较多基于 Groovy书写的 DSL,比如 GANT, GORM, XMLBuilder, HtmlBuilder等等。
三:我们的目标
实现一种使用 Groovy语法书写、用于构建 HTML的(其实就是 HtmlBuilder)的简单 DSL,如下:
html {
head {
meta {
}
}
body {
table (style:'margin:5px;') {
tr ('class':'trClass', style:'padding:5px;') {
td {'Cell1'}
td {'Cell2'}
td {'Cell3'}
}
}
}
}
这段代码比较容易让人懂,很容易让人将 HTML与之对应起来。具体怎么实现能够通过这一段 DSL代码输出原始的 HTML呢?主要基于 Groovy的以下几个特性:
Groovy脚本,不用定义 class
Groovy的 invokeMethod方法
方法可不书写()
语句末尾省略;分号
不书写 return
四:代码分析
meta {
}
//这段代码的含义为:调用 meta方法,参数为一个闭包,闭包不执行任何代码。
table (style:'margin:5px;') {
}
//这段代码的含义为:调用 table方法,第一个参数为 Map,第二个参数为闭包。
tr ('class':'trClass', style:'padding:5px;') {
td {'Cell1'}
td {'Cell2'}
td {'Cell3'}
}
//这段代码的含义为:
//调用 tr方法,第一个参数为 Map,第二个参数为闭包。
//闭包中,调用了 3 个 td方法,参数都为一个闭包;闭包中直接返回了一个字符串。
五:代码实现
将代码解读了以后,再结合 invokeMethod就很容易实现了,具体代码如下:
def invokeMethod(String name, args) {
print "<${name}"
args.each { arg ->
if (arg instanceof Map) {
arg.each {
print " ${it.key} ='${it.value}' "
}
} else if (arg instanceof Closure) {
print '>'
arg.delegate = this
def value = arg.call()
if (value) {
print "${value}"
}
}
}
println "</${name}>"
}
html {
head {
meta {
}
}
body {
table (style:'margin:5px;') {
tr ('class':'trClass', style:'padding:5px;') {
td {'Cell1'}
td {'Cell2'}
td {'Cell3'}
}
}
}
}
六:运行结果
<html><head><meta></meta>
</head>
<body><table style ='margin:5px;' >
<tr class ='trClass' style ='padding:5px;' >
<td>Cell1</td>
<td>Cell2</td>
<td>Cell3</td>
</tr>
</table>
</body>
</html>
七:结论
基于Groovy自身的语法简洁和众多特性,实现一个专属的DSL还是蛮简单的。
分享到:
相关推荐
在groovy中实现DSL领域特定语言的技术。 版权声明: 本系列文章是从原著《Groovy For Domain-Specific Languages》(原作者: Fergal Dearle)中翻译而来,从中加入了一些本人自己的读书笔记和理解。本系列文章不为...
本篇是哥自己根据《Gradle In Action》翻译的,继哥之前的Groovy DSL前传系列:用Groovy实现DSL领域定义语言(http://download.csdn.net/detail/vincentvalenlee/8382325)的后传翻译。通过gradle这个在项目构建领域...
是Java语言扩展,因此可以与Java语言互相调用。在所有基于JVM虚拟机的语言中只有Scala可以媲美。使用Groovy可以快速灵活完成文本处理,数据库访问,XML处理等常见任务。研究表明,使用Groovy比使用Java写程序,代码量...
groovy 一个不错的文档 实现dsl
#Groovy DSL 由Groovy和Grails用户组在伦敦组织的“让我们构建DSL”研讨会上(Skills Matter,2015年6月10日)开发了代码。
从Groovy转换为Kotlin DSL for Gradle,专注于Android
Groovy DSL 关于利用Groovy支持特定领域语言的闪电演讲 资源 演示幻灯片: :
groovy-ssh, 在 Groovy DSL上,基于SSH自动化工具 Groovy SSH是基于DSL的自动化工具,提供远程命令执行和文件传输。https://gradle-ssh-plugin.github.io捐赠这是一个在Apache许可以版 2.0下许可以的开源软件。 欢迎...
vertx-web-groovy-dsl Groovy DSL声明Vert.x Web路由 如果您使用Groovy,则本项目旨在提供另一种方法来使用vert-web定义网络路由,这种方式更具Groovy风格。 最有趣的功能是能够使用嵌套闭包以嵌套方式声明路由器...
自创Groovy DSL 动态规则(rule)执行引擎, 流程引擎. 特色 风控系统, 规则引擎, 动态接口配置(低代码)Groovy DSL 动态规则(rule)执行引擎。DSL(特定领域语言): 开发 和 业务 共识的语言。方便业务表达需求, 方便开发...
自创Groovy DSL 动态规则(rule)执行引擎, 流程引擎. 特色 风控系统, 规则引擎, 动态接口配置(低代码)
Groovy Docker DSL 使用 Groovy DSL 思考 ,您可以实现钩子、健康检查和监视包含 Dockerfile 的文件夹以进行更改,并根据需要自动重新构建和重新启动容器。 动机: Fig 很棒,但我需要一些可以让我做一些事情的...
这是一个基于 groovy 的小型 DSL,用于创建 Xposed 模块。 为什么是 Groovy? Groovy 是一种动态类型语言,它在 Java 反射方面具有一些不错的特性。 制作 DSL 很简单,而且很容易访问类上的私有字段等内容。 ...
AndroidGroovyDemo (GradleApplication)演示如何在 android studio 上使用 groovy 开发演示如何用 groovy 自定义 DSLwhy groovyyou know. 懒~ ^_^android + groovy 整合SwissKnife 整合致谢:本项目的 java 源代码...
and insightful coverage of how to use Groovy in-production tasks, including building new applications, integration with existing code, and DSL development, this is the only book you'll need....
groovy-jmx-dsl 用于基于 Swing 的 JMX 仪表板的 Groovy DSL
job-dsl-playground, 使用Jenkins工作DSL调试Groovy脚本的应用程序 Jenkins工作DSL游乐场http://job-dsl.herokuapp.com/使用 Jenkins工作DSL插件调试Groovy脚本的应用程序。 允许用户使用DSL创建作业并查看生成的XML...
Groovy 中的 DSL 这个项目伴随着上的。 特别。 运行测试 使用以下命令运行测试。 假设 groovy 已安装并存在于路径上。 groovy -cp src/main/groovy 例如 groovy -cp src/main/groovy src/test/groovy/...
红外DSL 用于Terraform的Groovy DSL。 干净,简单的方法来定义代码中的基础结构。不久将有更多描述。 享受下面的示例:) java -jar infra-dsl-VERSION.jar path_to_your_file.groovy Infrastructure . resource...