簡體   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