2017-09-01 9 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

ここで溶液はExtensionTestのインスタンスを指すc.prefixスルーxsを "見つける" ことである。

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)) 
関連する問題