2016-07-01 4 views
3

これは私が直面している問題の単純化されたバージョンですが、根本的な問題は残ります。 マクロを呼び出した後、私は動的にケースクラスを生成したい。私はマクロ呼び出しなどからパラメータを取得することができます。私が抱えている問題は、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内で文字列変数の二重引用符を引用符で囲まないようにするにはどうすればよいですか?

+0

quasiquoteを使いたい場合は、すべてのネストされた式に対してそれらを使用する必要があります。そうでなければ、文字列式を持ち上げるだけです。なぜ、caseクラス宣言を構築するときに、quasiquoteを使用することができないのですか? – devkat

+0

考え方は、 'val toGen = someMethod()'のようなものです。 'someMethod()'によって返される文字列は、 "case class Foo()"のようになります。あなたが正しく理解していれば、ケースクラスを返す際に準クォーツを使うべきだと提案していますか?しかし、これは私の問題があるところです。 'someMethod()'は常に同じケースクラスを返すわけではなく、入力などに基づいて動的に生成し、文字列を返します。 – brioche

+0

問題は、quasiquoteは文字列を解析しないので、持ち上げたい式が文字列として表現されているときは、それらを使うことができません。このケースでは、彼の答えでRégisJean-Gillesが示すように、文字列を解析する必要があります。 – devkat

答えて

3

Contextに定義されているparseメソッドがあります。それは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マクロを定義し、それは(あなたの場合のように)マクロ注釈と同じようにうまく動作するはずです。

+0

魅力のように動作します、ありがとうございます! – brioche

関連する問題