Рассмотрим тривиальный макрос:
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")""")
(используйте c.parse
в определении test
).
http://www.scala-archive.org/Expand-macros-before-typechecking-its-arguments-trees-td4641188.html
Scala: макрос для создания экземпляра из тела класса
Хороший обходной путь с переходными выражениями как
String
, спасибо.