Подтвердить что ты не робот

Как создать внутренний DSL в Scala?

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

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

2) Я хочу использовать "peers", такой FXOrder - это Scala.Proxy mixee, поэтому он использует признак Proxy (mixin)

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

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

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

и т.д.

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

PP

4b9b3361

Ответ 1

Возможно, это может вам помочь: DSL в Scala

Ответ 2

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

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

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