【问题标题】:Macro return type and higher order functions宏返回类型和高阶函数
【发布时间】:2012-07-27 04:50:56
【问题描述】:

我正在使用 2.10.0-M5 使用 Scala 宏,但我无法弄清楚为什么编译器认为返回类型是 Any 而不是 List[Int]。如果我删除对 map 的调用并只返回列表(将宏的最后一行更改为 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]                              ^

【问题讨论】:

  • 我对新的宏系统不太熟悉,但你的testImpl不应该返回c.Expr[List[Int]]而不是c.Expr[Any]吗?
  • 在这种情况下,这是一个选择。然而,在我的真实代码中,返回类型取决于宏的参数,所以我事先并不知道。无论如何,如果我删除对 map 的调用,它确实适用于 c.Expr[Any],所以这不是问题。

标签: scala macros scala-2.10


【解决方案1】:

【讨论】:

  • 感谢您的调查。但如果是这样的话,编译器会不会认为类型是List[Any] 而不仅仅是Any
  • 是的,你是对的,我仍然不明白错误的原因。更新了答案以消除误导性假设。
  • 当您对此进行调查时,您是否有任何解决方法的想法?
  • 你如何解释它在没有调用 map 的情况下工作?否则如何编写一个返回类型随参数而变化的宏呢?将c.Expr[Any] 指定为返回类型在其他情况下可以正常工作。
  • 我在上面编辑了我的答案以参考相应的票证。恐怕我们无法在 2.10.0-final 之前修复它,但幸运的是票证中提到了一种解决方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-25
  • 1970-01-01
  • 1970-01-01
  • 2012-10-25
  • 1970-01-01
  • 2022-11-02
  • 1970-01-01
相关资源
最近更新 更多