2012-08-28 15 views
5

? Podría estar utilizando una terminología incorrecta, pero aquí hay un ejemplo de lo que me gustaría lograr. Digamos que tengo la siguiente macro:¿Es posible aplazar la expansión de macros hasta que el tipo abstracto se vincule al tipo específico

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 
*/ 
} 

tengo la intención de utilizar sólo las clases de casos como T.

Cuando utilizo esta macro con la clase de caso que funciona muy bien, pero ahora me gustaría añadir un nivel de abstracción:

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

El problema que estoy teniendo es que la macro se expande cuando se declaró rasgo y en ese punto T se conoce como un tipo abstracto de 'T'. ¿Hay alguna manera de diferir la macro expansión hasta que mezcle este rasgo con algo concreto? Por ejemplo:

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

Al final, mi objetivo es usar macro para agregar un campo generado a una clase de caso. Tal vez hay una mejor manera de hacer eso?

Respuesta

2

Me sorprendería si esto resulta posible en 2.10.0.

Con tipos macro o macro anotaciones (http://scalamacros.org/future.html) debería ser bastante sencillo. Vamos a trabajar en estos nuevos sabores de macros tan pronto como lanzamos 2.10.0-final, pero es difícil predecir el ETA. Tal vez el invierno de 2012 - primavera de 2013.

Cuestiones relacionadas