Scala DSL:使用无参数方法链接的方法

wrm*_*wrm 6 dsl scala

我正在创建一个小scala DSL并遇到以下问题,我真的没有解决方案.我想要实现的一个小概念示例:

(Compute
 write "hello"
 read 'name
 calc()
 calc()
 write "hello" + 'name
)
Run Code Online (Sandbox Code Playgroud)

定义这个dsl​​的代码大致如下:

Object Compute extends Compute{
  ...
 implicit def str2Message:Message = ...
}
class Compute{
 def write(msg:Message):Compute = ...
 def read(s:Symbol):Compute = ...
 def calc():Compute = { ... }
}
Run Code Online (Sandbox Code Playgroud)

现在的问题是:如何在计算后摆脱这些括号?可能吗?如果是这样,怎么样?只是在定义中省略它们并没有帮助,因为编译错误.

wrm*_*wrm 4

好吧,我想,我找到了一个可接受的解决方案...我现在实现了这种可能的语法

 | write "hello"
 | read 'name
 | calc
 | calc
 | write "hello " + 'name 
Run Code Online (Sandbox Code Playgroud)

使用名为“|”的对象,我几乎可以编写我想要的 dsl。通常,一个“;” 如果无参数,则在 calc 之后需要。这里的技巧是接受 DSL 对象本身(这里是下一行的“|”)。使此参数隐式也允许calc作为此代码中的最后一个语句。好吧,看起来肯定不可能按照我想要的方式拥有它,但这也可以