2013-03-06 46 views
1

自从我开始在Scala编程,我对什么似乎是这种语言自然的编码风格,这是最简单的用一个简单的例子来解释所吸引:编码风格 - 表达的顺序在块斯卡拉

val a = { 
def f1(p : Int) = ... 
def f2(p : Int) = ... 
f1(12) * f2(100) 
} 

正如你所看到的,如果你想要理解代码是第一个你应该想要熟悉的操作,那么这些值的乘积是不会被发现的,直到最后一行为止。相反,您需要首先阅读拼图的各部分(函数f1,f2),然后才能看到它们如何实际排列。对我而言,这使得代码难以阅读。你如何处理这个问题 - 或者你根本没有发现它是一个问题?

+1

也许看到http://stackoverflow.com/questions/1284325/scala-equivalent-to-haskells-where-clauses – Impredicative 2013-03-06 14:39:33

回答

1

一个有趣的方法可能是使用untyped macro建议在宏观乐园引进了where结合,使得:

val a = (f1(12) * f2(100)) where { 
    def f1(x : Int) = x + 1 
    def f2(x : Int) = x + 2 
} 

被改写你的代码之上。据我所知,非类型化的宏将允许不存在的标识符f1和f2通过宏前类型检测。我认为重写应该相对简单,然后第二个类型检测会发现任何问题。但是,我从来没有写过任何宏,所以有可能会失败!如果有可能,我认为这将是一个相当不错的形式(并且重写将解决执行顺序的问题) - 如果我有一些时间,我可能会试图写它!

编辑:我已经写了这个,它的一部分变得非常容易。代码可在github。不幸的是,我到目前为止做的最好的是:

val result = where (f1(1) * f2(2), { 
    def f1(x : Int) = x + 1 
    def f2(x : Int) = x + 2 
    }) 

的问题是,Scala的缀运营商都只是方法调用,所以我需要有表达构建东西(F1(1)* F2 (2))以调用它们。但是,这是宏分辨率之前无法正确输入的表达式,所以我不太确定该怎么做。一个新问题的时间,methinks!

+0

谢谢,这很有趣。不幸的是,它增加了一些混乱的代码,所以我会留下这个问题,以防别人想要与他的想法一致。 – 2013-03-15 02:39:20

+0

值得注意的是,现在的语法比这个好一点。虽然Eugene Burmako建议可能会添加一些东西,但目前还不可能实现中缀位置。 – Impredicative 2013-03-15 09:22:03