【问题标题】:Infer a type of a tree in a scala macro在 scala 宏中推断树的类型
【发布时间】:2013-06-30 20:08:12
【问题描述】:

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

【问题讨论】:

    标签: scala macros scala-macros


    【解决方案1】:

    如果你已经对树进行了类型检查,你可以使用它的 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)
    

    当然,您也可以将其包装在表达式中,但如果您只需要类型,则没有必要。

    【讨论】:

      【解决方案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) - 实际类型。

      【讨论】:

        猜你喜欢
        • 2014-11-03
        • 2012-11-29
        • 1970-01-01
        • 2011-10-16
        • 2023-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多