当我尝试在 Scala 中构建内部 DSL 时,我遇到了一个常见问题并且我无法制定解决方案。为了让事情看起来更像一种典型的语言,我希望语法看起来像这样:
model 'Foo {
decl 'Real 'x;
decl 'Real 'y;
}
在实践中,有几个问题。第一个问题是让一个model
对象以这种方式接受两个参数。如果有人有任何想法,请告诉我。但我所做的是做一些更像这样的事情:
model('Foo) {
...
}
其中 model 现在是一个函数,然后返回一个带有apply
方法的对象,然后使用后面的 lambda。我可以忍受的。我也可以在 lambda 内部遇到类似的问题,所以内部有类似的decl 'Real 'x
问题decl('Real,'x)
。但我想要做的是获得波浪花括号内所有这些表达式的结果,以作为列表“返回”。换句话说,我想要的是这样写:
model 'Foo {
decl('Real,'x);
decl('Real,'y);
}
wheredecl(...)
评估为某种类型Declaration
,{...}
然后评估为List[Declaration]
. 我怀疑有一些方法可以使用隐式来做到这一点,但我一直没能找到它。简而言之,我想做:
model 'Foo {
decl('Real,'x);
decl('Real,'y);
}
...评估为...的等价物
model 'Foo {
decl('Real,'x) ::
decl('Real,'y) ::
Nil
}
意见或建议?