2013-07-01 18 views
5

benim makro bazı tip bir WeakTypeTag var ve aşağıdaki gibi ben kod oluşturmak istiyorum:Bir scala makrosunun içinden WeakTypeTag uygulamasının oluşturulması mümkün mü?

def macroCreate[A] = macro _macroCreate[A] 
def _macroCreate[A](c: Context)(implicit wtt: c.WeakTypeTag[A]) = { 
    c.Expr(Apply(Select(???, newTermName("apply")), List(c.literal(1).tree))) 
} 

sorundur:

macroCreate[SomeObject] // => SomeObject(1) 

bir makro tanımı böyle bir şey olacak , verilen tür için Select nasıl alabilirim?

"." numaralı bölüme ayrılan ve ardından dize listesinden bir Select oluşturmak için, türü bir dizgeye dönüştürmenin bir geçici çözümünü kullanabilirim, ancak bu hacky gibi görünüyor.

Select doğrudan tip etiketinden mi oluşturulabilir?

cevap

8

Sen arkadaşı nesnenin sembolü almak ve evrenin Ident(sym: Symbol): Ident fabrika yöntemi kullanabilirsiniz: Eğer gerçekten SomeObject türüdür anlamına Eğer

scala> case class SomeObject(i: Int) 
defined class SomeObject 

scala> macroCreate[SomeObject] 
res0: SomeObject = SomeObject(1) 

scala> macroCreate[List[Int]] 
res1: List[Int] = List(1) 

: o zaman

def macroCreate[A] = macro _macroCreate[A] 

def _macroCreate[A](c: Context)(implicit wtt: c.WeakTypeTag[A]) = { 
    import c.universe._ 

    c.Expr(
    Apply(
     Select(Ident(wtt.tpe.typeSymbol.companionSymbol), newTermName("apply")), 
     c.literal(1).tree :: Nil 
    ) 
) 
} 

Ve nesne (yani, onun eşlik eden sınıfının türü değil), yukarıdaki .companionSymbol'u kaldırmanız yeterlidir.

+2

Küçük bir düzenleme ekledim (select içinde 'newTermName'), çünkü scalac kullanımdan kaldırma uyarısı atar. Teşekkürler! – Rogach

+0

Oh, sağ - teşekkürler! Çok hızlı yazarak ... –

İlgili konular