5

間違った用語を使用している可能性がありますが、ここに私が達成したい例を示します。次のマクロがあるとします。

def generateField[T]: AnyRef =
  macro generateFieldImpl[T]

def generateFieldImpl[T: c.AbsTypeTag](c: Context): c.Expr[AnyRef] = {
/**
 * here I'm looking at the type T by reflection to see now many members it has
 * and based on that I'm generating TupleN[Array[Byte], ...](null, ...)
 * where N is number of members in class represented by type T
 */
}

ケースクラスのみを T として使用する予定です。

このマクロをケース クラスで使用するとうまく機能しますが、抽象化のレベルを追加したいと思います。

trait WithGeneratedField[T] {
  val _myField = generateField[T]
}

私が抱えている問題は、特性が宣言されているときにマクロが展開され、その時点で T が抽象型 'T' として知られていることです。この特性を具体的なものと混ぜるまで、マクロ展開を延期する方法はありますか? 例えば:

case class MyClass(a: String, b: Int) extends WithGeneratedField[MyClass]

最後の私の目標は、マクロを使用して、生成されたフィールドをケース クラスに追加することです。多分それを行うより良い方法がありますか?

4

1 に答える 1

2

これが 2.10.0 で可能になるとは驚きです。

マクロ タイプまたはマクロ アノテーション ( http://scamacros.org/future.html ) を使用すると、かなり簡単になります。2.10.0-final がリリースされ次第、これらの新しいフレーバーのマクロに取り組む予定ですが、ETA を予測するのは困難です。2012年の冬から2013年の春くらいかな。

于 2012-09-04T15:03:24.197 に答える