4

これは私が直面している問題の単純化されたバージョンですが、根本的な問題は残っています。マクロを呼び出した後、ケース クラスを動的に生成したいと考えています。マクロ呼び出しなどからパラメーターを取得できます。問題は、準引用符内で文字列変数を使用しようとすることです。私は基本的に次のことを望んでいます:

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
}

ただし、ケース クラスは生成されません。toGen を q"case class Foo()" に変更すると機能することがわかりましたが、 toGen は、文字列を返す他の処理の後に生成する文字列であるため、それを行うことはできません。このようにコンパイルし、toReturn の値を手動で確認すると、次のようになります。

Expr[Any]("case class Foo()")

文字列 toGen は、引用符に沿って単純に貼り付けられます。つまり、ケース クラスは生成されません。

同様の問題を探しましたが、この例はどこにも見つかりません。準引用符内の文字列変数の二重引用符を外すにはどうすればよいですか?

4

1 に答える 1

4

parseで定義されたメソッドがありContextます。を返しますTree。ツリーは準引用符で補間できるため、解析と準引用符を簡単に組み合わせることができます。例:

scala> :paste
// Entering paste mode (ctrl-D to finish)

import scala.reflect.macros.whitebox.Context
import scala.language.experimental.macros

def test_impl(c: Context)(): c.Tree = {
  import c.universe._
  val tree = c.parse("""println(2)""")
  q"println(1); $tree; println(3)"
}
def test(): Unit = macro test_impl

// Exiting paste mode, now interpreting.

import scala.reflect.macros.whitebox.Context
import scala.language.experimental.macros
test_impl: (c: scala.reflect.macros.whitebox.Context)()c.Tree
defined term macro test: ()Unit

scala> test()
1
2
3

この例では、def マクロを定義しましたが、(あなたの場合のように) マクロ注釈でも同様に機能するはずです。

于 2016-07-01T14:58:42.337 に答える