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