实现DSL的几个例子

实现DSL的几个例子

所谓DSL就是能描述语言的语言,一般某些领域都有自己的专有术语,用这些术 语来交流比一般的通用的语言更流畅,比如象棋的“平五进八”,这种走棋的表达比自然语言更快,DSL就是把这种领域的语言翻译成“自然语言”的模型。一般 有内部和外部之分,内部指领域语言嵌入在自然语言中用自然语言表达,相当于从“古文”中进化出“普通话”的过程;外部则指全新的语言,比如Java, C等,是一个全新的描述模型,创造起来比内部要复杂。举几个例子容易明白,下面几个是内部的DSL。

使用连贯接口

这是”The productive Programmer”中的例子,要描述的领域是“食谱”。比如“recipe.add 200.grams.of Flour”。

1. class Numeric
2.    def gram
3.     self
4.    end
5.  
6.    alias_method :grams , :gram
7. end

Ruby可以打开一个存在的类向其中添加方法,所以可以写出200.grams这种有点恶心的句子,而且ruby中方法可以不加括号(),光这点用Java实现就够呛。不过用method chain会使用很多点点点,有点像人没有进化完全而留下点阑尾…

下面这个例子来自”Programming Scala Tackle Multi-Core Complexity on the Java Virtual Machine”,要描述的领域为“ 时间 ”,比如“2 days ago”。
01. object App
02. {
03.    def main(args : Array [ String ]) : Unit =
04.    {
05.      implicit def convertInt2DateHelper(number: Int) = new DateHelper(number)
06.      val ago = "ago"
07.      val from_now = "from_now"
08.      val past = 2 days ago
09.      val appointment = 5 days from_now
10.      println(past)
11.      println(appointment)
12.    }
13.  
14.      import java.util. _
15.      class DateHelper(number: Int) {
16.          def days( when : String ) : Date = {
17.              var date = Calendar.getInstance()
18.              when match {
19.                  case "ago" => date.add(Calendar. DAY_OF_MONTH , -number)
20.                  case "from_now" => date.add(Calendar. DAY_OF_MONTH , number)
21.                  case _ => date
22.              }
23.              date.getTime()
24.          }
25.      }
26. }

这里面当Scala遇到Int类型的2时,会自动的选择implicit的方法把这个整数转换为DateHelper类,不清楚这是语言的功能还是 VM的特征,这里并没有扩展Int类型:加上days的方法。Scala有个Traits的功能,倒是可以扩展类,暂时不大清楚。

计算器

这里有讲到:面向 Java 开发人员的 Scala 指南: 构建计算器,第 1 部分 解决如何计算如((5 * 10) + 7)这样的表达式。这倒是一个DSL的好例子,不过文章最后把核心问题交给了Becker-Naur Form(BNF),这就有点走向外部DSL的,这么简单的表达式也很难搞,看来内部DSL不能描述复杂的语法结构,高级一点的又得求助于语法解析器。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值