在宏内部,如何让编译器推断构造树的类型?我只找到了 Context.typeCheck,但它只检查类型但不返回结果。
问问题
1218 次
2 回答
10
如果您已经对树进行了类型检查,则可以使用它的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)
当然,您也可以将其包装在表达式中,但如果您只想要类型,则无需这样做。
于 2013-06-30T21:34:06.917 回答
4
我想通了,我希望这可以为其他人省去麻烦
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 为空。
方法mac
只返回 () 但它打印出Any
- 上限和Int(2)
- 实际类型。
于 2013-06-30T20:28:39.263 回答