如何在Scala中创建内部DSL?

时间:2010-10-05 05:32:13

标签: scala dns dsl specifications

我一直在查看有关特定领域语言的几本书籍和资源。 我想我想在Scala中构建一个内部DSL。

def instrument = new FXInstrument {

     provider = "EuroBase"
     instrumentOrders = List(
         new FXOrder {
             baseCcy = "GBP"
             termCcy = "EUR"
             legs = List( 
                 new FXLeg {
                    amountPrice = 100000.0
                    spotPrice = 1.56
                    requirements = List(
                        new FXRequirement {
                           baseCcy="GBP" termCcy="EUR" 
                           settlement="Banker Rain"
                        }
                    )
                 },
                 new FXLeg {
                    amountPrice = 200000.0
                    spotPrice = 1.50
                    requirements = List(
                        new FXRequirement {
                           baseCcy="GBP" termCcy="EUR" 
                           settlement="Banker Sunny"
                        }
                    )
                 }
             )

         }                  
}

以下断言有效:

 instrument.orders(0).baseCcy should equal ("GBP")
 instrument.orders(0).termCcy should equal ("EUR")
 instrument.orders(0).legs(0).amountPrice should equal 100000.0
 instrument.orders(0).legs(0).spotPrice should equal 1.56
 instrument.orders(0).legs(1).amountPrice should equal 200000.0
 instrument.orders(0).legs(1).spotPrice should equal 1.50
 instrument.orders(0).legs(0).requirements(0).settlement should equal "Banker Rain"
 instrument.orders(0).legs(1).requirements(0).settlement should equal "Banker Sunny"

我只是不知道如何将域特定语言实现为内部表示

1)新的FXOrder(){/ 关闭 /}

我喜欢这种语法,它是好还是我更喜欢伴侣对象。 例如,我可以很容易地快速介绍其他外汇类型。

2)我想使用“peer”这样的FXOrder是一个scala.Proxy mixee,因此它使用了trait Proxy(mixin)

例如``instrument.peer''给出第三方专有API的内部对等Java对象(一个众所周知的金融服务交易系统,你能猜到吗?)

同上

instrument.orders(0).peer    instrument.orders(0).legs(0).peer    instrument.orders(0).legs(0).requirements(0).peer

等等。

我意识到领域特定的语言并不像我想象的那么简单,但是上面的一些指针确实很有用。非常感谢您的回复。的Ta!

PP

2 个答案:

答案 0 :(得分:5)

也许,这可以帮到你:DSL in Scala

答案 1 :(得分:5)

我还没考虑过你想要的东西,但我看到了一个问题:

  

1)新的FXOrder(){/ closure /}

不,它不起作用。当您使用块进行初始化(new Something)时,您正在进行匿名子类化。你实际做的是new FXOrder() { /constructor, methods, getters and setters/ }