2012-02-07 72 views
6

我正在创建一个小型scala DSL,并遇到以下问题,但我没有真正解决问题。我想要什么小的概念性例子来实现:Scala DSL:使用无参数方法链接方法

(Compute 
write "hello" 
read 'name 
calc() 
calc() 
write "hello" + 'name 
) 

代码定义这个DSL大致是这样的:

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

现在的问题:我该如何计算后摆脱这些括号?可能吗?如果是这样,怎么样?只是在定义中忽略它们并不能解决编译错误。

回答

3

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

| write "hello" 
| read 'name 
| calc 
| calc 
| write "hello " + 'name 

使用名为对象“|”,我能够写出近我想要的DSL 。非常规,一个“;”如果其无参数,则在计算后需要。这里的技巧是接受DSL对象本身(这里是它的下一行的“|”)。使此参数隐含也允许calc作为此代码中的最后一个语句。 好吧,看起来确实不可能按照我想要的方式拥有它,但这也可以。

+0

耶!整蛊! ))) – noncom 2012-09-11 08:47:33

-1

首先尝试从calc的定义中删除括号。其次尝试在整体上使用大括号而不是括号。大括号和括号并不意味着相同,我发现括号在单行代码中效果最好(除非使用分号)。另请参见What is the formal difference in Scala between braces and parentheses, and when should they be used?

+1

这里有一个使用parantheses的原因。方法链并不真正适用于换行符,除非它被“()”包围,因为scala知道它是唯一的一条语句。不适用于“{}”。离开calc def的缺陷并不奏效,因为那时,语法scala糖不再起作用,我不能链式调用另一种方法 – wrm 2012-02-07 10:01:50

+0

啊..我正在想另一种方式。你有什么编译错误?你能压缩你的例子是否可以运行? – thoredge 2012-02-07 11:55:25

+0

它标记最后一行并说: \t - 在类Compute中缺少方法写入的参数; '''如果您想将其视为部分应用函数,请按照此方法 \t - ')'预期但找到符号字面量。 这里的问题是从'x.y(p1).z(p2)'到'x y p1 z p2'的正常转换不起作用,因为它更像'x.y.z(p2)',它不能明显地转换为糖。除了使用方法链来实现类似的功能外,还有其他一些方法,但是我无法找到一种实现THIS语法的工作方式...... – wrm 2012-02-07 12:39:19

3

不可能摆脱括号,但可以将其替换。例如:

object it 

class Compute { 
def calc(x: it.type):Compute = { ... } 

(Compute 
write "hello" 
read 'name 
calc it 
calc it 
write "hello" + 'name 
) 

要扩大一点,每当看到斯卡拉是这样的:

object method 
non-reserved-word 

它假定它意味着object.method(non-reserved-word)。相反,每当它看到这样的事情:

object method object 
method2 object2 

它假定这是两个独立的语句,如object.method(object); method2.object,期待method2是一个新的对象,object2的方法。

这些假设是斯卡拉文法的一部分:它的目的就是这样。

+0

我刚来到一个类似的解决方案(有calc的参数),就像我刚才写的一样(参见我的答案)。我还尝试了其他几种方法,如一个case类或一个静态方法调用,但看起来,这是唯一的方法 – wrm 2012-02-07 18:12:54

+0

如果您有一些时间,请问为什么无法摆脱圆括号? – kisileno 2013-09-05 13:37:14

+0

另一个问题是围绕所有表达式的括号,我们可以避免它们,以及如何? – kisileno 2013-09-05 13:47:59