2012-08-28 9 views
5

Możliwe, że używam niewłaściwej terminologii, ale oto przykład, który chciałbym osiągnąć. Powiedzmy mam następujące makro:Czy można odroczyć makro, dopóki typ abstrakcyjny nie zostanie przypisany do określonego typu?

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

mam zamiar używać tylko zajęcia przypadków jak T.

Kiedy używam tego makra z klasą przypadku działa świetnie, ale teraz chciałbym dodać poziom abstrakcji:

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

problem mam jest to, że makro zostanie rozszerzony gdy cecha jest zadeklarowane i w tym punkcie T jest znany jako abstrakcyjne typu „T”. Czy istnieje sposób na odroczenie ekspansji makr, dopóki nie połączę tej cechy z czymś konkretnym? Na przykład:

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

Na koniec moim celem jest użycie makra do dodania wygenerowanego pola do klasy sprawy. Może jest lepszy sposób na zrobienie tego?

Odpowiedz

2

Byłbym zaskoczony, gdyby to okazało się możliwe w 2.10.0.

Przy typach makr lub adnotacjach makro (http://scalamacros.org/future.html) powinno być całkiem proste. Będziemy pracować nad tymi nowymi smakami makr, gdy tylko wydamy wersję 2.10.0-final, ale trudno jest przewidzieć ETA. Może zima 2012 - wiosna 2013.

Powiązane problemy