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