自从我开始使用Scala编程以来,我倾向于使用这种语言中的自然编码风格,用一个简单的例子来解释它是最简单的:
val a = {
def f1(p : Int) = ...
def f2(p : Int) = ...
f1(12) * f2(100)
}
正如您所看到的,值的乘法,如果您想要理解代码,是您应该想要熟悉的第一个操作,直到最后一行才能找到。相反,您需要首先阅读拼图的各个部分(函数f1,f2),然后才能看到它们的实际排列方式。对我来说,这使代码更难阅读。你是如何处理这个问题的 - 或者你根本没有发现这个问题?
答案 0 :(得分: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))上构造一些东西才能调用它们。但这是在宏观分辨率之前不能正确输入的表达式,所以我不太清楚该怎么做。是时候提出一个新问题吧!