これは私が直面している問題の単純化されたバージョンですが、根本的な問題は残ります。 マクロを呼び出した後、私は動的にケースクラスを生成したい。私はマクロ呼び出しなどからパラメータを取得することができます。私が抱えている問題は、quasiquotes内で文字列変数を使用しようとしています。私は本質的に次のようにしたい:Scalaのquasiquotesを使用して文字列変数を持ち上げる
def expand_impl(c: Context)(annottees: c.Expr[Any]*): c.Expr[Any] = {
import c.universe._
val toGen = "case class Foo()"
val toReturn = c.Expr[Any](
q"$toGen"
)
toReturn
}
しかし、ケースクラスは生成されません。今私は、私が "ケースクラスFoo()"に変換すると、それがうまくいくことを知っていますが、toGenは文字列を返す他の処理の後に生成する文字列なので、それはできません。
Expr[Any]("case class Foo()")
toGenは、単にケースクラスが生成されていないという意味、引用符に沿って、中にペーストされた文字列: このようにそれをコンパイルし、手動でtoReturnの値を見て、私は次を得ます。
私は同様の問題を探しましたが、この例はどこにも見つかりませんでした。 quasiquote内で文字列変数の二重引用符を引用符で囲まないようにするにはどうすればよいですか?
quasiquoteを使いたい場合は、すべてのネストされた式に対してそれらを使用する必要があります。そうでなければ、文字列式を持ち上げるだけです。なぜ、caseクラス宣言を構築するときに、quasiquoteを使用することができないのですか? – devkat
考え方は、 'val toGen = someMethod()'のようなものです。 'someMethod()'によって返される文字列は、 "case class Foo()"のようになります。あなたが正しく理解していれば、ケースクラスを返す際に準クォーツを使うべきだと提案していますか?しかし、これは私の問題があるところです。 'someMethod()'は常に同じケースクラスを返すわけではなく、入力などに基づいて動的に生成し、文字列を返します。 – brioche
問題は、quasiquoteは文字列を解析しないので、持ち上げたい式が文字列として表現されているときは、それらを使うことができません。このケースでは、彼の答えでRégisJean-Gillesが示すように、文字列を解析する必要があります。 – devkat