scala宏:本地扩展?

scala宏:本地扩展?,scala,macros,scala-macros,Scala,Macros,Scala Macros,scala 2.11宏能否强制其参数的宏展开 下面是我的用例:我从中的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] = { im

scala 2.11宏能否强制其参数的宏展开

下面是我的用例:我从中的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""")

甚至

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

完整的
mprintf
位于文档链接中(向下滚动一半,或搜索“完整定义”)。重要的区别在于
mprintf
将其参数匹配为
文本(常量(…)
,与只需要类型良好的参数的
mconcat
不同,宏正在展开,问题是
mprintf
需要一个字符串文本,而在您的示例中展开后,它的参数仍然是
“what”.concat(“a”.concat(“burger”)
。啊!抢手货但是,即使不调用
concat
,我似乎也无法在
mconcat
宏中穿行字符串——请参见上文。您的两个简化版本都适用于我,我不确定错误消息中的类型归属来自何处。这是
上下文。我使用的是
scala.reflect.macros.blackbox.Context
,但是如果
mconcat
的参数是
scala.reflect.macros.whitebox.Context
,那么示例就起作用了。宏是否总是得到完全展开的语法树(在任何深度都没有未展开的宏)?
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