首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在scala宏中推断树的类型

在scala宏中推断树的类型
EN

Stack Overflow用户
提问于 2013-07-01 04:08:13
回答 2查看 1.2K关注 0票数 6

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-01 05:34:07

如果您已经对树进行了类型检查,那么只需使用它的tpe方法:

代码语言:javascript
复制
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)

当然,您也可以将其封装在表达式中,但如果您只需要该类型,则不需要这样做。

票数 10
EN

Stack Overflow用户

发布于 2013-07-01 04:28:39

我想通了,希望这能省去别人的麻烦

代码语言:javascript
复制
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中,您可以查询实际的类型。Any是为了提供一个法律上的上限。否则,推断出的类型将是ExprNothing,您将会遇到麻烦。问题是包装从c.typeCheck返回的树,否则类型就是空的。

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17394389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档