scala宏:本地扩展?
scala 2.11宏能否强制其参数的宏展开 下面是我的用例:我从中的printf宏开始,然后创建自己的宏来连接字符串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
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