ネストされたケース クラスを出力する 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]] に変換して、可変数のネストされたオブジェクトをマクロ出力にパックできるようなスプライスを行うことができません。動的に構築されたリストを具体化して、コンストラクターの引数として使用するにはどうすればよいですか?