Как создать внутренний DSL в Scala? - PullRequest
12 голосов
/ 05 октября 2010

Я просматривал пару книг и ресурсов на предметно-ориентированных языках.Я думаю, что я хочу построить внутренний DSL в 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"
                        }
                    )
                 }
             )

         }                  
}

Так, чтобы следующие утверждения действовали:

 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) new FXOrder () {/ closure /}

Мне нравится этот синтаксис, хорош ли он или я должен предпочесть сопутствующие объекты.Например, я могу быстро ввести другие типы FX.

2) Я хочу использовать «пиров», такой FXOrder, как микшер scala.Proxy, поэтому он использует черту Proxy (mixin)

Например, `instrument.peer 'дает внутреннему равноправному Java-объекту стороннего проприетарного API (хорошо известную вам систему торговли финансовыми услугами?)

То же самое для

инструмента.orders (0) .peer instrument.orders (0) .legs (0) .peer instrument.orders (0) .legs (0) .requirements (0) .peer

и т. д.

Я понимаю, что предметно-ориентированный язык не так прост, как я думал, однако некоторые указатели по этому поводу были бы действительно полезны.Буду признателен за ваши ответы.Та!

ПП

Ответы [ 2 ]

5 голосов
/ 05 октября 2010

Я еще не учел то, что вы хотите, но я увидел проблему:

1) новый FXOrder () {/ closure /}

Нет, так не работает. Когда вы выполняете инициализацию (new Something) с блоком, вы делаете анонимное создание подклассов. То, что вы на самом деле делаете, это new FXOrder() { /constructor, methods, getters and setters/ }.

5 голосов
/ 05 октября 2010

Может быть, это может вам помочь: DSL в Scala

...