在宏內部,如何讓編譯器推斷構造樹的類型? 我只找到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. Java中的Scala元組類型推斷
- 5. scala中的參數類型推斷
- 6. Scala方法推斷的泛型類型
- 7. 與_佔位Scala的類型推斷
- 8. Scala的類型推斷問題
- 9. Scala的類型推斷:不能推斷IndexedSeq [T]從Array [T]
- 10. Scala字符串與java.lang.String - 類型推斷
- 11. scala隱式參數類型推斷
- 12. 在Scala中泛型類型的函數成員參數類型的推斷?
- 13. 匹配Scala宏中的泛型類型
- 14. 在Scala中推斷正確類型的lambda表達式
- 15. 理解Scala的類型推斷和extensial類型
- 16. 與函數類型Scala的類型推斷
- 17. 類型構造器的Scala類型推斷
- 18. 在Intellij Scala插件中顯示推斷類型
- 19. SML中的類型推斷
- 20. Scala宏和類型擦除
- 21. 推斷類型泛型類
- 22. Scala中`def`和`val`的不同類型推斷
- 23. 多態函數中的Scala自動類型推斷
- 24. 是否可以改進Scala中部分應用類型的類型推斷?
- 25. F#類型推斷
- 26. 「VAR」 類型推斷
- 27. 偏類型推斷
- 28. 在C中的類型推斷#
- 29. 類型推斷 - 無法推斷Monad
- 30. 這個代碼示例中scala如何推斷類型?