Scala宏:如何传递其他参数

时间:2017-09-01 17:58:41

标签: scala scala-macros

所以我在扩展方法中有一个方法应该扩展为宏。我遇到的问题是如何在宏实现调用中包含扩展方法的接收器?

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]] = ???
}

1 个答案:

答案 0 :(得分:2)

这里的解决方案是“找到”xsc.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))