2017-09-01 48 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))