【发布时间】:2022-09-28 15:07:10
【问题描述】:
我有点像发现一个用例的宏,在这个用例中,我试图从函数中提取 lambda arg 名称。为此,我定义了这个类(假设在模块 A 中):
object MacroTest {
def getLambdaArgNames[A, B](f: A => B): String = macro getLambdaArgNamesImpl[A, B]
def getLambdaArgNamesImpl[A, B](c: Context)(f: c.Expr[A => B]): c.Expr[String] = {
import c.universe._
val Function(args, body) = f.tree
val names = args.map(_.name)
val argNames = names.mkString(\", \")
val constant = Literal(Constant(argNames))
c.Expr[String](q\"$constant\")
}
现在在另一个模块中,我正在尝试编写一个单元,例如检查传递给 lambda 的参数名称:
class TestSomething extends AnyFreeSpec with Matchers {
\"test\" in {
val f = (e1: Expr[Int]) => e1 === 3
val argNames = MacroTest.getLambdaArgNames(f)
println(argNames)
assert(argNames === \"e1\")
}
}
但是这段代码不能编译,因为:
scala.MatchError: f (of class scala.reflect.internal.Trees$Ident)
但是,如果我直接将 lambda 传递给像 MacroTest.getLambdaArgNames((e1: Expr[Int]) => e1 === 3) 这样的函数,它就可以工作,所以我对导致代码无法编译的原因非常迷茫。
任何可能的解决方案来解决这个问题?
标签: scala scala-macros