views:

134

answers:

2

I have been looking at a couple of books and resources on domain specific languages. I think I want to build an internal DSL in Scala.

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"
                        }
                    )
                 }
             )

         }                  
}

Such that following asserts are valid:

 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"

I just do not know quite how to implement the domain specific language as an internal representation

1) new FXOrder() { /closure/ }

I like this syntax, is it good or should I prefer companion objects. For instance I can quickly introduce other FX types easy.

2) I want to use "peers" such FXOrder is a scala.Proxy mixee, thus it uses the trait Proxy (mixin)

For example ``instrument.peer'' gives the internal peer Java Object of the third party proprietary API (a well known financial services trading system, can you guess?)

Ditto for

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

and so on.

I realise that domain specific language is not as simple as I thought, however some pointers on this above, would be really be useful. I would appreciate your responses. Ta!

PP

+3  A: 

Maybe, this can help you: DSL in Scala

Antoras
+2  A: 

I haven't considered what you want yet, but I saw a problem:

1) new FXOrder() { /closure/ }

No, it doesn't work that way. When you follow an initialization (new Something) with a block, you are doing anonymous subclassing. What you are actually doing is new FXOrder() { /constructor, methods, getters and setters/ }.

Daniel