一种有趣的方法可能是使用宏天堂中的无类型宏提议来引入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)) 上构造一些东西才能调用它们。但这正是在宏解析之前无法正确输入的表达式,所以我不太确定该怎么做。是时候提出一个新问题了,我想!