我有一个输出嵌套案例类的 scala 宏。我可以组装使用 reify 创建的表达式片段,以编程方式构建嵌套案例类:
case class Foo(name: String)
case class Bar(foo: Foo)
def foo(name: String) = {
c.universe reify {
Foo(c.literal(name).splice)
}
}
def bar(foo: Expr[Foo]) = {
c.universe reify {
Bar(foo.splice)
}
}
// output Bar(Foo("MyFoo"))
c.Expr( bar(foo("MyFoo").asInstanceOf[Expr[Foo]]).tree )
除了烦人的演员表之外,一切都很好(我该如何解决?)。我被卡住的地方是当我希望宏输出一些需要内部对象集合的案例类时,这些内部对象的大小会根据宏在它正在处理的 AST 中看到的内容而变化。
因此,如果我有一个采用 foo 序列的类:
case class Baz(foos: Seq[Foo])
我想做一些类似的事情:
def baz(foos: Seq[Expr[Foo]]): Expr[Baz] = {
val flipped: Expr[Seq[Foo]] = ??? // convert foos from Seq[Expr[Foo]] to Expr[Seq[Foo]]
c.universe reify {
Baz(flipped.splice)
}
}
// now pack any number of Foos into an output Baz as required
c.Expr(baz(Seq(foo("MyFoo1"),foo("MyFoo2"))).tree)
我无法将 Seq[Expr[Foo]] 转换为 Expr[Seq[Foo]] 来进行拼接,这样我就可以将可变数量的嵌套对象打包到宏输出中。如何具体化一个动态构建的列表以用作构造函数 arg?