1

例如,我想用这种形式创建一个宏:

def debug(fn: => Unit): Unit = if (doDebug) fn else ()

我尝试了以下方法:

def debug(fn: => Unit): Unit = macro debugImpl
def debugImpl(c: Context)(fn: c.Expr[Unit]): c.Expr[Unit] = {
  if (doDebug) fn else reify(())
}

但它因编译错误而失败:

macro implementation has wrong shape:
  required: (c: scala.reflect.macros.Context)(fn: c.Expr[=> Unit]): c.Expr[Unit]
  found   : (c: scala.reflect.macros.Context)(fn: c.Expr[Unit]): c.Expr[Unit]
  type mismatch for parameter fn: c.Expr[=> Unit] does not conform to c.Expr[Unit]
    def debug(fn: => Unit): Unit = macro debugImpl

如果我将fn参数的类型写为c.Expr[=> Unit],它显然会因编译错误而失败。

我正在使用scala 2.10.2. 有没有办法实现这样的宏?

4

1 回答 1

2

您可以使用c.Expr[Any]和更改fn:的类型c.Expr[Unit](fn.tree)

def debug(fn: => Unit): Unit = macro debugImpl
def debugImpl(c: Context)(fn: c.Expr[Any]): c.Expr[Unit] = {
  import c.universe.reify
  if (true) c.Expr[Unit](fn.tree) else reify(())
}


scala> debug( println("abc") )
abc
于 2013-06-14T04:49:37.703 回答