我正在玩Scala宏使用2.10.0-M5,我不知道爲什麼編譯器認爲返回類型是Any
而不是List[Int]
。如果我刪除調用映射並返回列表(將宏的最後一行更改爲c.Expr(list)
),它將按預期工作。此外,宏確實返回一個List[Int]
,編譯器不知道它。宏返回類型和更高階函數
宏定義:
def test(s:String) = macro testImpl
def testImpl(c:Context)(s:c.Expr[String]):c.Expr[Any] = {
import c.universe._
val list = reify(List(1)).tree
val function = reify((x:Int) => x).tree
val res =
Apply(
Select(
list,
newTermName("map")),
List(function)
)
c.Expr(res)
}
宏調用:
val list:List[Int] = test("")
錯誤消息:
[error] found : Any
[error] required: List[Int]
[error] val list:List[Int] = test("")
[error] ^
我不是太熟悉新的宏系統,但不應該你的'測試Impl' return'c.Expr [List [Int]]'而不是'c.Expr [Any]'? – 2012-07-27 05:02:44
在這種情況下,這將是一個選項。然而,在我的真實代碼中,返回類型取決於宏的參數,所以我不提前知道它。無論如何,如果我刪除了映射的調用,它確實與'c.Expr [Any]'一起工作,所以這不是問題。 – 2012-07-27 05:14:47