将隐式解析推迟到宏扩展
Postpone implicit resolution until macro expansion
考虑微不足道的宏:
def test[A](a: A): Unit = macro testImpl[A]
def testImpl[A: c.WeakTypeTag](c: blackbox.Context)(a: c.Expr[A]): c.Expr[Unit] = {
import c.universe._
println("Test running")
c.Expr[Unit](q"")
}
及其调用
def foo(a: String)(implicit b: Int): Unit = ???
test(foo("123"))
它给出了一个错误
[error] Main.scala:19:18: could not find implicit value for parameter b: Int
[error] test(foo("123"))
是否可以将隐式解析推迟到宏扩展时间或在这种情况下需要编写宏注释?
与注释无类型注释的宏注释相反,def 宏的参数总是在展开宏之前进行类型检查。类型检查包括隐式解析。
你也可以尝试做一个def宏的参数String
test("""foo("123")""")
(在 test
的定义中使用 c.parse
)。
http://www.scala-archive.org/Expand-macros-before-typechecking-its-arguments-trees-td4641188.html
考虑微不足道的宏:
def test[A](a: A): Unit = macro testImpl[A]
def testImpl[A: c.WeakTypeTag](c: blackbox.Context)(a: c.Expr[A]): c.Expr[Unit] = {
import c.universe._
println("Test running")
c.Expr[Unit](q"")
}
及其调用
def foo(a: String)(implicit b: Int): Unit = ???
test(foo("123"))
它给出了一个错误
[error] Main.scala:19:18: could not find implicit value for parameter b: Int
[error] test(foo("123"))
是否可以将隐式解析推迟到宏扩展时间或在这种情况下需要编写宏注释?
与注释无类型注释的宏注释相反,def 宏的参数总是在展开宏之前进行类型检查。类型检查包括隐式解析。
你也可以尝试做一个def宏的参数String
test("""foo("123")""")
(在 test
的定义中使用 c.parse
)。
http://www.scala-archive.org/Expand-macros-before-typechecking-its-arguments-trees-td4641188.html