scala宏:本地扩展?

时间:2015-11-01 08:58:15

标签: scala macros scala-macros

scala 2.11宏可以强制其参数的宏扩展吗?

这是我的用例:我从documentation开始使用printf宏,然后创建自己的宏来连接字符串。

def mconcat(s1: String, s2: String, s3: String): String = macro mconcat_impl
def mconcat_impl(c: Context)(s1: c.Expr[String], s2: c.Expr[String], s3: c.Expr[String]): c.Expr[String] = {
  import c.universe._
  c.Expr[String](q"""$s1.concat($s2.concat($s3))""")
}

我希望将这两个宏组合起来,

mprintf(mconcat("what", "a", "burger"))

但宏扩展中出现匹配错误。

修改

感谢Travis Brown指出mconcat没有扩展为字符串文字。对于那个很抱歉!但是如果我们将mconcat的值简化为:

,仍然存在问题
c.Expr[String](q"""$s1""")

s1

甚至

c.Expr[String](Literal(Constant("what")))

所有三个都给出了相同的错误消息:

Test.scala:8: error: exception during macro expansion:
  scala.MatchError: ("what": String) (of class scala.reflect.internal.Trees$Typed)
at Printf$.printf_impl(Printf.scala:23)

  mprintf(mconcat("what", "a", "burger"))
         ^
one error found

0 个答案:

没有答案