在scala宏中推断一种树的类型

时间:2013-06-30 20:08:13

标签: scala macros scala-macros

在宏内部,我如何要求编译器推断构造树的类型? 我只找到了Context.typeCheck,但它只检查类型但不返回结果。

2 个答案:

答案 0 :(得分:8)

如果您对树进行了类型检查,则可以使用其tpe方法:

scala> def impl(c: Context) = c.literal(c.typeCheck(c parse "1+1").tpe.toString)
impl: (c: scala.reflect.macros.Context)c.Expr[String]

scala> def mac = macro impl
mac: String

scala> println(mac)
Int(2)
当然, 还可以将其包装在表达式中,但如果您只是想要该类型,则无需使用。

答案 1 :(得分:2)

我想出来了,我希望这可以节省别人的麻烦

import reflect.macros.Context
import language.experimental.macros

def impl(c: Context) = {
  val tree = c.parse("1+1")
  val expr = c.Expr[Any](c.typeCheck(tree))
  println(expr.staticType)
  println(expr.actualType)
  c.literalUnit
}

def mac = macro impl

通过包装到Expr中,您可以查询实际类型。任何都可以提供合法的上限。没有它,感染类型将是Expr [Nothing],你会遇到麻烦。问题是包装从c.typeCheck返回的树,否则Type只是null。

方法mac只返回(),然后打印出Any - 上限和Int(2) - 实际类型。