Java通过Scala宏进行有效的命令式循环?

时间:2015-04-07 16:33:05

标签: scala macros metaprogramming scala-macros

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循环的自然方法是什么?

0 个答案:

没有答案