scala - 如何在 Scala 中创建内部 DSL?

标签 scala dns dsl specifications

我一直在查看一些有关特定领域语言的书籍和资源。 我想我想在 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) new FXOrder() {/闭包/}

我喜欢这种语法,它好吗,或者我应该更喜欢伴随对象。 例如,我可以轻松快速地介绍其他 FX 类型。

2) 我想使用“peers”,例如 FXOrder 是一个 scala.Proxy mixee,因此它使用特征 Proxy (mixin)

例如“instrument.peer”给出了第三方专有API的内部对等Java对象(一个众所周知的金融服务交易系统,你能猜到吗?)

同上

instrument.orders(0).peer 仪器.订单(0).legs(0).peer Instrument.orders(0).legs(0).requirements(0).peer

等等。

我意识到领域特定语言并不像我想象的那么简单,但是上面的一些指示确实很有用。我将不胜感激您的回复。塔!

PP

最佳答案

我还没有考虑过你想要什么,但我看到了一个问题:

1) new FXOrder() { /closure/ }

不,事情不是这样的。当您使用 block 进行初始化(new Something)时,您正在执行匿名子类化。您实际上所做的是 new FXOrder() {/constructor,methods, getters and setters/}

关于scala - 如何在 Scala 中创建内部 DSL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3861055/

相关文章:

json - 斯卡拉和瑟茜 : JSON encoding with optional fields

scala - 如何绕过 Scala 中 MongoRecord 的不变性

hibernate - 如何定义域中是否有多个唯一字段?

eclipse - Xtext:JvmModelInferrer 初始化字段

groovy - groovy 中的 splat 运算符?

java - 提取 DBPedia Dump 期间 DBPedia 提取框架失败

docker - Kubernetes DNS 查找非常慢,ndots :5

amazon-web-services - AWS Route53 区域委派到内部数据中心名称服务器

java - Java 中 apache POI 的 DSL 包装库

scala - 如何使用 Scala 将字符串转换为 ASCII