在宏內部,如何讓編譯器推斷構造樹的類型? 我只找到Context.typeCheck,但只檢查類型但不返回結果。在scala宏中推斷樹的類型
4
A
回答
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)
-實際的類型。
相關問題
- 1. Scala類型推斷失敗?
- 2. Scala類型推斷限制
- 3. Scala推斷的類型參數 - 類型範圍推斷爲'Nothing'
- 4. scala中推斷的參數類型
- 5. Java中的Scala元組類型推斷
- 6. scala中的參數類型推斷
- 7. Scala方法推斷的泛型類型
- 8. 與_佔位Scala的類型推斷
- 9. Scala的類型推斷問題
- 10. Scala中的嵌套類型的類型推斷
- 11. Scala的類型推斷未能推斷類型的通用功能
- 12. Scala的類型推斷:不能推斷IndexedSeq [T]從Array [T]
- 13. Scala字符串與java.lang.String - 類型推斷
- 14. scala隱式參數類型推斷
- 15. scala宏如何推斷隱含CanBuildFrom
- 16. 在Scala中和Then()中的類型推斷
- 17. 在Scala中泛型類型的函數成員參數類型的推斷?
- 18. 在Scala中推斷正確類型的lambda表達式
- 19. 匹配Scala宏中的泛型類型
- 20. 與函數類型Scala的類型推斷
- 21. 類型構造器的Scala類型推斷
- 22. 理解Scala的類型推斷和extensial類型
- 23. 在Intellij Scala插件中顯示推斷類型
- 24. SML中的類型推斷
- 25. Scala宏和類型擦除
- 26. 推斷類型泛型類
- 27. 多態函數中的Scala自動類型推斷
- 28. Scala中`def`和`val`的不同類型推斷
- 29. 是否可以改進Scala中部分應用類型的類型推斷?
- 30. F#類型推斷