2017-09-01 46 views
0

所以我有一個擴展方法應擴展爲宏的方法。我遇到的問題是如何在宏實現調用中包含擴展方法的接收方?斯卡拉宏:如何傳遞其他參數

implicit class ExtensionTest(xs: List[Int]) { 
    def foo(fun: Int => Int)(implicit ord: Ordering[Int]): List[Int] = 
    macro ExtensionTest.fooImpl // how to pass `xs`? 
    } 

object ExtensionTest { 
    def fooImpl(c: blackbox.Context) 
      (fun: c.Expr[Int => Int]) 
      (ord: c.Expr[Ordering[B]]): c.Expr[List[Int]] = ??? 
} 
+0

不可能的,宏觀的限制 – cchantep

回答

0

這裏的解決方案是 「找到」 xs通過c.prefix指向的ExtensionTest實例:

implicit class ExtensionTest(val xs: List[Int]) { 
    def foo(fun: Int => Int)(implicit ord: Ordering[Int]): List[Int] = 
    macro ExtensionTest.fooImpl 
} 

object ExtensionTest { 
    def fooImpl(c: blackbox.Context)(fun: c.Expr[Int => Int]) 
      (ord: c.Expr[Ordering[Int]]): c.Expr[List[Int]] = { 
    import c.universe._ 
    reify { 
     c.prefix.splice.asInstanceOf[ExtensionTest].xs.map(fun.splice).sorted(ord.splice) 
    } 
    } 
} 

測試:

assert(List(6, 1, 7, 4).foo(_ + 2) == List(3, 6, 8, 9))