为了回答这个问题,我一直在尝试使用宏天堂分支在 Scala 中实现 Haskell 风格的“where”表达式。该代码可在scala-where获得。我现在可以写如下内容:
val result = where ( f1(1) * f2(2), {
def f1(x : Int) = x + 1
def f2(x : Int) = x + 2
})
但是,我真正想做的是能够在中缀位置调用它:
val result = ( f1(1) * f2(2)) where {
def f1(x : Int) = x + 1
def f2(x : Int) = x + 2
}
通常,这种事情很容易,但我看不出如何通过宏调用来做到这一点。表达式 (f1(1) * f2(2)) 不会在宏应用之前输入,所以像构建一个隐式值类这样的东西是行不通的。有没有办法获得这种语法?
如果做不到这一点,只有两个参数列表可以做到:
val result = where (f1(1) * f2(2)) {
def f1(x : Int) = x + 1
def f2(x : Int) = x + 2
}
会很好,但这似乎很难。可以用两个参数列表调用一个宏吗?