2013-06-30 39 views

回答

7

如果你類型檢查的樹,你可以只使用其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)-實際的類型。