我解构功能,得到 vparams ,现在我可以致电:
case class Action(f: Function, ts: List[TypeName]) {
def render(ruleName: String): Expr[Unit] = c.Expr[Unit](q"""
val p = ${c.prefix}
val value1 = p.valueStack.pop().asInstanceOf[${ts(0)}]
val value2 = p.valueStack.pop().asInstanceOf[${ts(1)}]
p.valueStack.push($f(value1, value2))
""")
}
f 具有在编译时已知的任意数量的参数。
如何将 ts.count 参数从 p.valueStack 传递到函数 f ?
答案 0 :(得分:1)
这样的事情怎么样:
case class Action(f: Function, ts: List[TypeName]) {
def render(ruleName: String): Expr[Unit] = {
val argNames = (1 to ts.size).map(i => newTermName(s"value$i"))
val args = argNames.map(name => Ident(name))
val valDefs = (ts zip argNames).map {
case (tn, argName) =>
q"val $argName = p.valueStack.pop().asInstanceOf[$tn]"
}
c.Expr[Unit]( q"""
val p = ${c.prefix}
..$valDefs
p.valueStack.push($f(..$args))
""")
}
}
这编译(在Scala 2.10.2中使用Macro Paradise插件),但我没有测试它是否有效。