Scala宏将良好类型的术语作为参数而不是任意AST,因此使用它们做某些事情并不明显,特别是引入新的绑定表单。
让我们说我希望有一个新的Scala命令,用于循环去尾递归或while循环。例如,这个:
for_imp (i <- 1 to 10) {
/* work */
}
会厌恶这个:
{
var i = 1
while (i <= 10) {
/* work */;
i += 1
}
}
或者这个:
@tailrec def loop(i: Int): Unit =
if (i <= 10) {
/* work */;
loop(i + 1)
}
loop(1)
由于我们无法为i
引入新的约束,这种方法是否有意义:制作一个将for-opt
映射到expr[Unit]
的新表单expr[Unit]
;如果它的论点恰好具有for
的正确形式,则优化它,否则不管它:
for_opt(e: expr[Unit]): expr[Unit] =
e match {
case /* for loop */ => /* transform */
case e => e
}
在Scala中实现Java高效命令式for
循环的自然方法是什么?