2010-10-05 17 views
12

Szukałem kilku książek i zasobów na temat języków specyficznych dla domeny. Myślę, że chcę zbudować wewnętrzną DSL w Scala.Jak utworzyć wewnętrzną linię DSL w Scali?

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

     }     
} 

taka, że ​​po twierdzi obowiązują:

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" 

ja po prostu nie wiem zupełnie, jak wdrożyć język specyficzny domeny jako wewnętrzną reprezentację

1) Nowy FXOrder() {/ zamknięcie /}

Podoba mi się ta składnia, czy to dobrze, czy też powinienem preferować obiekty towarzyszące. Na przykład mogę szybko wprowadzić inne typy FX łatwe.

2) Chcę użyć „rówieśników” taki FXOrder jest mixee scala.Proxy, dlatego używa cecha Proxy (wstawek)

Na przykład `` instrument.peer „” daje JavaObject wewnętrzny rówieśniczej z zastrzeżonych API cywilnej (znanego systemu obrotu usług finansowych, można się domyślać?)

Ditto dla

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

i tak dalej.

Zdaję sobie sprawę, że język specyficzny dla danej domeny nie jest tak prosty, jak myślałem, ale niektóre wskazówki na ten temat będą naprawdę przydatne. Byłbym wdzięczny za twoje odpowiedzi. Ta!

PP

+1

Możesz zajrzeć na http://programming-scala.labs.oreilly.com/ch11.html#InternalDSLs –

Odpowiedz

6

Może, może to pomóc: DSL in Scala

+0

Ten link się zepsuł. :( – Kao

+0

https://www.amazon.com/Programming-Scala-Scalability-Functional-Objects/dp/0596155956%3FSubscriptionId%3DAKIAILSHYYTFIVPWUY6Q%26tag%3Dduckduckgo-d-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953 % 26creativeASIN% 3D0596155956 – adrian

5

nie uznały, czego jeszcze chcesz, ale widziałem problemu:

1) Nowy FXOrder () {/ closure /}

Nie, to nie działa w ten sposób. Podczas wykonywania inicjalizacji (new Something) za pomocą bloku wykonuje się anonimową podklasę. To, co faktycznie robisz, to new FXOrder() { /constructor, methods, getters and setters/ }.