繁体   English   中英

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

[英]Infer a type of a tree in a scala macro

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

如果您已对树进行了类型检查,则可以使用其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)

当然,你可以将它包装在一个表达式中,但是如果你只是想要这个类型就没有必要。

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

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],你会遇到麻烦。 catch是包装从c.typeCheck返回的树,否则Type只是null。

方法mac只返回()bu打印出Any -upper bound和Int(2) - 实际类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM