2013-08-28 30 views
1

我已经解构功能,得到了它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是是在编译时已知参数任意数字。

如何从p.valueStack通过ts.count参数传递给函数˚F

回答

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的微距天堂插件),但我没有测试它是否正常工作。

+0

最终确实有效。你可以在[parboiled2 wip分支]找到神圣魔法(https://github.com/sirthias/parboiled2/commit/e6f0f51b6a13cabb713916855b37155dabedc8a0#L2R231) –

相关问题