0

Sadece makrolar ile başladı ve gerçekten acı belirgin bir şey eksik gibi hissediyorum alıyorum için ağaç incelemek benim Makro, sonuçta ona bir şeyler yapmak istiyorum ama ilk engele düştüm.Scala makro <p></p> Ben geçirilen anonim lambda fonksiyonu için AST incelemek istiyorum ... anonim fonksiyonu

Kodum şunun gibi görünüyor;

object Test extends App { 
    doIt(() => "bar") 

    def doIt(f:() => String) = { 
    Builder.build(f) 
    } 
} 

object Builder { 
    def build[R](func:() => R): String = macro builder_impl[R] 

    def builder_impl[R](c: blackbox.Context)(func: c.Expr[() => R]): c.Expr[String] = { 
    import c.universe._ 

    println(showRaw(func)) 

    reify { 
     println("hello yeah") 
     "foo" 
    } 
    } 
} 

ShowRaw gibi bir şey yazdırmayı bekliyorum; Bununla birlikte, bunun yerine;

Expr(Ident(TermName("f"))) 

ben böyle Builder.build çağrı yerinde benim anonim işlev tanımlayarak istediğini elde edebilirsiniz;

Builder.build(() => "bar") 

Ancak, ihtiyacım olanı yapmama yardımcı olmuyor.

Bazıları lütfen yanlış anlamadığım şeyi açıklayabilir, hedefime nasıl ulaşabilirim?

Ayrıca okumam gereken harika bir Scala makro yemek kitabı var mı?

Saygılarımızla,

Ryan.

cevap

1

Yalnızca bir makro geçirilen şeyin AST olsun (dahil sadece makro build bu durumda ve siz f ait AST olsun böylece, argüman f ile diyoruz). Yani doIt(() => "bar")() => "bar" AST'yi almak istiyorsanız, doIt'un kendisi bir makro olmalıdır.