Я просматривал пару книг и ресурсов на предметно-ориентированных языках.Я думаю, что я хочу построить внутренний 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
и т. д.
Я понимаю, что предметно-ориентированный язык не так прост, как я думал, однако некоторые указатели по этому поводу были бы действительно полезны.Буду признателен за ваши ответы.Та!
ПП