我一直在查看有关特定领域语言的几本书籍和资源。 我想我想在Scala中构建一个内部DSL。
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(){/ 关闭 /}
我喜欢这种语法,它是好还是我更喜欢伴侣对象。 例如,我可以很容易地快速介绍其他外汇类型。
2)我想使用“peer”这样的FXOrder是一个scala.Proxy mixee,因此它使用了trait Proxy(mixin)
例如``instrument.peer''给出第三方专有API的内部对等Java对象(一个众所周知的金融服务交易系统,你能猜到吗?)
同上
instrument.orders(0).peer instrument.orders(0).legs(0).peer instrument.orders(0).legs(0).requirements(0).peer
等等。
我意识到领域特定的语言并不像我想象的那么简单,但是上面的一些指针确实很有用。非常感谢您的回复。的Ta!
PP
答案 0 :(得分:5)
也许,这可以帮到你:DSL in Scala
答案 1 :(得分:5)
我还没考虑过你想要的东西,但我看到了一个问题:
1)新的FXOrder(){/ closure /}
不,它不起作用。当您使用块进行初始化(new Something
)时,您正在进行匿名子类化。你实际做的是new FXOrder() { /constructor, methods, getters and setters/ }
。